我遇到了运行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查询的值),因此必须包含变量声明:)
如何解决这个问题?
答案 0 :(得分:0)
我还是vb和vba的新手并且自学,但我知道你可以在VB.net中声明和写入变量,然后可以将其输入到嵌入式SQL脚本中。我认为你可以在vba中做同样的事情。这就是我的建议。
如果对这两个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查询的更有效方法:)