繁体   English   中英

将Null从Excel传递给SQL

[英]Passing Nulls from Excel to SQL

我正在使用VBA脚本更新SQL中的表,到目前为止它完美无缺。 问题是处理空值时。 因为VBA脚本循环直到第一列结束,所以工作表中的某些值为null,但它们在sql中被置为零。

在Excel中:

    Name     Last name      Age    
    daniel   mtz            22
    jose     mtz            25
    John     doe    

SQL中的最终结果:

    Name     Last name      Age    
    daniel   mtz            22
    jose     mtz            25
    John     doe            0

有关如何告诉宏或SQL将它们读为空而不是零的任何想法?

PS,编写sql中的每一列以在相应的值中放置null不是一个选项,因为这个表将不断变化,我可以填充所有列,或者只是一些,等等。

[更新]以下是VBA的代码:

Sub Macro_CargarSQL()

'VARIABLES
Dim conn As New ADODB.Connection
Dim iRowNo As Integer
'Column variables
Dim sname, slastname, sage As String

'CONECTION TO SERVER Y BD
conn.Open "Provider=SQLOLEDB;Data Source=Termxgesvsql07\vfsitesamn;Initial Catalog=DW_PLCO;Integrated Security=SSPI;"
'Import into SQL
With Sheets("test")
    'Start row 2
    iRowNo = 2
    'Delete previous
    conn.Execute "delete from table"

    'Loop for insert
    Do Until .Cells(iRowNo, 1) = ""
        sname = .Cells(iRowNo, 1)
        slastname = .Cells(iRowNo, 2)
        sage = .Cells(iRowNo, 3)

        conn.Execute "insert into dbo.table (name, lastname,age ) values ('" & sname & "', '" & slastname & "', '" & sage & "')"
        iRowNo = iRowNo + 1
    Loop
End With
conn.Close
Set conn = Nothing

End Sub

我这样做的一种方法是创建两个SQL字符串并对实际值进行检查。

您可以按如下方式执行此操作(如果您有一个数组,通常这会更容易,因为您可以通过值/字段名编写迭代)。

Do Until .Cells(iRowNo, 1) = ""
    sName = .Cells(iRowNo, 1)
    slastname = .Cells(iRowNo, 2)
    sage = .Cells(iRowNo, 3)

    Dim sqlStrStart As String
    Dim sqlStrValues As String
    Dim sqlStrFull As String

    sqlStrStart = "insert into dbo.table ("
    sqlStrValues = " values ("

    'build string dynamically (generally I do this using parameters, but this will work)
    If sName <> "" Then
        sqlStrStart = sqlStrStart + "name,"
        sqlStrValues = sqlStrValues + sName & ","
    End If
    If slastname <> "" Then
        sqlStrStart = sqlStrStart + "lastname,"
        sqlStrValues = sqlStrValues + slastname & ","
    End If
    If sName <> "" Then
        sqlStrStart = sqlStrStart + "age,"
        sqlStrValues = sqlStrValues + sage & ","
    End If

    'remove last comma
    sqlStrStart = Left(sqlStrStart, Len(sqlStrStart) - 1)
    sqlStrValues = Left(sqlStrValues, Len(sqlStrValues) - 1)

    'close parenthesis
    sqlStrStart = sqlStrStart & ")"
    sqlStrValues = sqlStrValues & ")"

    'combine
    sqlStrFull = sqlStrStart + sqlStrValues + ";"


    conn.Execute sqlStrFull
    iRowNo = iRowNo + 1
Loop

最好的方法是创建一个检查单元格值是否为空的函数。 为空时,输出应为"null" ,但如果不为"null" ,则将值括在单引号之间。

也可以使用此函数,以便可以转义其中包含单引号的值(例如“O'Brien”)。 否则,在当前代码中,您将遇到SQL错误。

这是功能:

Function toSQL(s)
  If s = "" Then toSQL = "null" Else toSQL = "'" & Replace(s, "'", "''") & "'"
End Function

这是替换插入语句:

conn.Execute "insert into dbo.table (name, lastname,age ) values (" & toSQL(sname) & ", " & toSQL(slastname) & ", " & toSQL(sage) & ")"

如果您始终调用toSQL函数,并且一致地将SQL数据库中的列定义为可为空,那么您将被设置。 如果数据类型是数字,您可能不想调用toSQL

在Excel VBA中设置null值时使用此选项,并将其传递给SQL参数的值。

DBNull.Value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM