Excel VBA代码中带有variables声明的T-SQL查询失败

在VBA中使用“declare”和“set”函数运行SQL查询时出现问题。

Sheets("Arkusz1").Select connstring = _ "ODBC;DRIVER=SQL Server;SERVER=my_database_server;UID=user;PWD=password;APP=Microsoft Office 2010;WSID=some_id;DATABASE=mydatabase" With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Worksheets("Arkusz1").Range("A1"), Sql:=Array( _ "declare @dzisiaj date" & Chr(13), _ "set @dzisiaj = getdate()" & Chr(13), _ "select @dzisiaj as dzisiaj")) .BackgroundQuery = False .Refresh End With 

在SQL Server 2012的代码工作正常,但是…当我把它embedded到它给我一个运行时错误“1004”。 另外VBA代码适用于其他查询运作良好。

我的完整的SQL查询有大约90行2variables声明(一个声明是从另一个30行SQL查询的值),所以它是强制性的,包括variables声明:)

如何解决这个问题?

我还不熟悉vb和vba并学习我自己,但是我知道你可以在VB.net中声明和写入variables,然后将它们馈送到embedded式SQL脚本中。 我认为你可以在vba中做同样的事情。 这是我的build议。

  1. 声明一个像SQL_Var_1这样的VBstring
  2. 在主查询之前插入30行SQL查询作为单独的查询。
  3. 将30行查询的结果写入vbstringSQL_Var_1。
  4. 从主SQL查询中删除声明,但保留对这些variables的引用。
  5. 参考SQL_Var_1作为embedded式主要查询中的input参数,使用您在主查询中使用的完全相同的名称(即@dzisiaj),就像这里一样。

如果您对这两个SQLvariables执行这些步骤,则应该能够获得与使用已声明的SQLvariables相同的结果。

我想到了。 关键是使用ADODB连接通过SQL Query导入数据。 在Visual Basic编辑器的工具 – >引用(快捷键:Excel中的Alt + F11)中检查Microsoft Active X数据对象2.0库也是必要的。

所以,有一个我的VBA代码的例子:

  Sub sql_query_import() ' Declarations Dim Cn As ADODB.Connection Dim Server_Name As String Dim Database_Name As String Dim User_ID As String Dim Password As String Dim SQLStr As String Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset ' Server connection settings Server_Name = "192.168.1.106\my_database" ' IP of server name Database_Name = "mydatabase" ' Database name User_ID = "myusername" ' User name Password = "mypassword" ' User password ' SQL Query SQLStr = "SET NOCOUNT ON " & Chr(13) ' it's mandatory if you don't want to get error 3704 SQLStr = SQLStr & "declare @dzisiaj date " & Chr(13) SQLStr = SQLStr & "set @dzisiaj = getdate() " & Chr(13) SQLStr = SQLStr & "select @dzisiaj as 'today' ' Connect to database Set Cn = New ADODB.Connection Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _ ";Uid=" & User_ID & ";Pwd=" & Password & ";" ' Start connection rs.Open SQLStr, Cn, adOpenStatic ' Load data With rs For i = 1 To .Fields.Count Worksheets(1).Cells(1, i) = .Fields(i - 1).Name ' Include column name if not - delete it Next i End With Worksheets(1).Cells(2, 1).CopyFromRecordset rs ' Start loading data to Cell A2 rs.Close Set rs = Nothing Cn.Close Set Cn = Nothing End Sub 

在SQL查询中使用如果你不想得到错误3704,那么“SET NOCOUNT ON”是必须的。另外,使用

 SQLStr = "SET NOCOUNT ON " & Chr(13) ' it's mandatory if you don't want to get error 3704 SQLStr = SQLStr & "declare @dzisiaj date " & Chr(13) 

是包含多行SQL查询的更有效的方法:)