通过INSERTT INTO SELECT连接到SQL Server引用Excel表



我在Excel中使用此代码将表导出到SQL Server表

Sub ExportToSQLServer()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset
Dim sConn As String, sSQL As String
sConn = "Provider=SQLOLEDB.1;" & _
"Integrated Security=SSPI;" & _
"Persist Security Info=True;" & _
"Initial Catalog=ES_RTR_Staging;" & _
"Data Source=sqlnode23;" & _
"Use Procedure for Prepare=1;" & _
"Auto Translate=True;" & _
"Packet Size=4096;" & _
"Use Encryption for Data=False;" & _
"Tag with column collation when possible=False"
cnn.Open sConn
'Code here to set up ES_RTR_Staging table prior to import of new data (all works fine)
'// this is where I am having a problem with correct syntax to reference a table named "tblTempFD" on
'a sheet named "TempFcast" (both tab name and code name the same for that sheet)
sSQL = "INSERT INTO " & sTblID & _
" SELECT * FROM tblTempFD"
cnn.Execute sSQL
'// also tried
sSQL = "INSERT INTO " & sTblID & _
" SELECT * FROM [TempFcast$] tblTempFD"
cnn.Execute sSQL
'// Error is "Invalid Object Name"
End Sub

我无法获得引用Excel表的正确语法,非常感谢任何帮助或指针。

[TempFcast$]正在尝试调用evaluate函数。当你把这样的标识符括起来时,你调用它的对象会查看它是否有一个成员ID为-5的函数(DISPID_EVALUATE)。如果它找到一个,它会将括号的内容作为后期绑定调用传递给该函数,以确定它是什么

在这种情况下,您在工作表(如果它在Worksheet模块中)、工作簿(如果它位于ThisWorkbook中)或Excel.Application(如果它处于标准模块中)上隐式调用DISPID_EVAUATE。

工作表实际上有一个映射到Evaluate函数的DISPID_EVAUATE成员。如果您的代码在工作表模块中,则相当于:

Me.Evaluate("TempFcast$")

这是Worksheet.Evaluate的垃圾输入,因此您会得到一个运行时错误2015。

Excel.Workbook-没有DISPID_EVALUATE成员,因此它返回到Application对象。这意味着它相当于:

Application.Evaluate("TempFcast$")

这也是Application.Evaluate的垃圾输入,它实际上将调用传递给ActiveSheet.Evaluate("TempFcast$")

所以,长话短说,除非您打算调用.Evaluate,否则不要在Excel中使用外部调用(括号内)语法。即使您确实打算调用.Evaluate,也应该出于这个原因调用.Evaluate。解决方案是只删除括号并显式使用Name属性。

最新更新