将Excel中的空值传递给SQL
我正在使用VBA脚本更新SQL表,到目前为止,它完美的工作。 问题是处理空值时。 由于VBA脚本循环直到第一列结束,所以工作表中的某些值为空,但在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
任何想法如何告诉macros或SQL读取它们为null而不是零?
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
我这样做的一个方法是创build两个SQLstring,并对实际值进行检查。
你可以这样做(一般来说,如果你有一个数组,你可以通过你的values / fieldnames来迭代),这样做更容易一些。
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
最好的方法是创build一个函数来检查单元格值是否为空。 当为空时,输出应为"null"
,但如果不是,则将该值放在单引号之间。
这个函数也可以使用,所以你可以转义其中有单引号的值(比如“O'Brien”)。 否则,在你当前的代码中,你会遇到一个SQL错误。
这个function:
Function toSQL(s) If s = "" Then toSQL = "null" Else toSQL = "'" & Replace(s, "'", "''") & "'" End Function
这里是replace插入语句:
conn.Execute "insert into dbo.table (name, lastname,age ) values (" & toSQL(sname) & ", " & toSQL(slastname) & ", " & toSQL(sage) & ")"
如果您始终调用toSQL
函数,并且一致地将SQL数据库中的列定义为可为空,则您将被设置。 如果数据types是数字的,你可能不想调用toSQL
。