我有很多 SQL 脚本,其中许多在整个过程中使用各种不同的变量,我希望能够将结果直接放入 Excel。希望尽可能“顺利”地做到这一点,以便当有人给我一个新的 SQL 脚本(可能相对复杂)时,设置收集其结果的电子表格相对干净。
目前正在尝试使用 ADODB 命令对象参数来使其工作,但我什至无法获得一个非常基本的示例来工作。我有以下 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 算术溢出错误,试图将某些东西转换为 datetime),但它没有做什么我期待着。
我想有两个问题:有没有办法修复这段代码?有没有更好的方法来实现开头描述的总体目标?