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

时间:2013-12-06 12:53:38

标签: sql excel tsql vba excel-vba

我遇到了运行SQL查询的问题"声明"和"设置" VBA中的功能。

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中,该代码工作正常,但是......当我将其嵌入其中时,会给我一个运行时错误' 1004'。此外,VBA代码适用于其他查询也很有效。

我的完整SQL查询大约有90行,带有2个变量声明(一个声明是来自另一个30行SQL查询的值),因此必须包含变量声明:)

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我还是vb和vba的新手并且自学,但我知道你可以在VB.net中声明和写入变量,然后可以将其输入到嵌入式SQL脚本中。我认为你可以在vba中做同样的事情。这就是我的建议。

  1. 声明类似SQL_Var_1
  2. 的vb字符串
  3. 在主查询之前将30行SQL查询作为单独的查询插入。
  4. 将30行查询的结果写入vb字符串SQL_Var_1。
  5. 从主SQL查询中删除声明,但保留对这些变量的引用。
  6. 使用您在主查询中使用的完全相同的名称(即@dzisiaj)引用SQL_Var_1作为嵌入式主查询中的输入参数,例如here
  7. 如果对这两个SQL变量都执行这些步骤,则应该能够获得与使用声明的SQL变量时相同的结果。

答案 1 :(得分:0)

我明白了。关键是使用ADODB连接通过SQL Query导入数据。还有必要检查工具中的Microsoft Active X Data Objects 2.0库 - > Visual Basic编辑器中的引用(快捷方式:Excel中的Alt + F11)。

所以,有一个我的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

如果您不想收到错误3704,则必须在SQL查询中使用“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查询的更有效方法:)