我有很多SQL脚本,其中很多都使用各种不同的变量,我希望能够将结果直接删除到Excel中。希望是顺利地做到这一点。尽可能地,当有人给我一个新的SQL脚本(可能相对复杂)时,设置收集其结果的电子表格相对干净。
目前正在尝试使用ADODB Command对象参数,但我甚至无法获得一个非常基本的示例。我有以下VBA:
Dim oConnection As ADODB.Connection
Set oConnection = New ADODB.Connection
oConnection.ConnectionString = "MyConnectionString"
oConnection.Open
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = oConnection
到此为止只是设置连接,这似乎工作正常。
cmd.CommandText = "DECLARE @DateID integer;" & _
"SELECT TOP 10 * FROM dbo.SomeRecords " & _
"WHERE DateID = @DateID"
cmd.CommandType = adCmdText
Dim DateID As ADODB.Parameter
Set DateID = cmd.CreateParameter("@DateID", adInteger, adParamInput)
cmd.Parameters.Append DateID
DateID.Value = 20120831
Dim rst AS ADODB.RecordSet
Set rst = cmd.Execute()
ActiveSheet.Range("A1").CopyFromRecordset rst
不幸的是,这并没有任何回报。但是,如果我替换该行:
"WHERE DateID = @DateID"
用这个:
"WHERE DateID = 20120831"
然后查询会准确返回您期望的内容(8月31日的前10条记录),所以显然我没有正确地将变量的值从VBA传递给SQL,但我不得不承认我几乎被卡住了。
当然某些东西正在传递给SQL(如果我在SQL中将变量@DateID的类型更改为datetime,那么我会尝试将某些内容转换为SQL Server算术溢出错误日期时间),但它没有做我期待的事情。
我想有两个问题:有没有办法解决这个问题?是否有更好的方法来实现一开始所描述的总体目标?
答案 0 :(得分:1)
从SQL字符串中删除DECLARE @DateID integer;
。
即:
cmd.CommandText = "SELECT TOP 10 * FROM dbo.SomeRecords " & _
"WHERE DateID = @DateID"
答案 1 :(得分:1)
ADO参数化查询中的参数需要?
作为占位符,所以:
"SELECT TOP 10 * FROM dbo.SomeRecords WHERE DateID = ?"
答案 2 :(得分:1)
试试这个
cmd.CommandText = "DECLARE @DateID integer;" & _
"SET @DateID = ?DateID;" & _
"SELECT TOP 10 * FROM dbo.SomeRecords " & _
"WHERE DateID = @DateID"
.....
Set DateID = cmd.CreateParameter("?DateID", adInteger, adParamInput)
回复:
在这种情况下,为什么首先要为他们设置名称
好吧,所以你可以如上所示匹配它们。一定要多次使用它,但是使用sql-server local
声明并将其设置为如图所示。