我正在使用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将它们读为空而不是零的任何想法?
P.S,编写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
答案 0 :(得分:0)
我这样做的一种方法是创建两个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
答案 1 :(得分:0)
最好的方法是创建一个检查单元格值是否为空的函数。为空时,输出应为"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
。
答案 2 :(得分:0)
在Excel VBA中设置null
值并将其传递给SQL参数的值时,请使用此值。
DBNull.Value