在 vba 中使用 ADODB 在 SQL 中命名变量

Joh*_*ben 5 sql sql-server excel vba adodb

我有很多 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
Run Code Online (Sandbox Code Playgroud)

到这里只是建立连接,这似乎工作正常。

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不会返回任何内容。但是,如果我替换该行:

"WHERE DateID = @DateID"
Run Code Online (Sandbox Code Playgroud)

有了这个:

"WHERE DateID = 20120831"
Run Code Online (Sandbox Code Playgroud)

然后查询完全返回您所期望的(8 月 31 日的前 10 条记录),所以很明显我没有将变量的值从 VBA 正确传递到 SQL,但我不得不承认我几乎卡住了.

当然有些东西被传递到 SQL(如果我在 SQL 中将变量 @DateID 的类型更改为日期时间,那么我会收到一个 SQL Server 算术溢出错误,试图将某些内容转换为日期时间),但它并没有做什么我很期待。

我想有两个问题:有没有办法修复这段代码?有没有更好的方法来实现开头描述的总体目标?

Ric*_*iwi 2

尝试这个

cmd.CommandText = "DECLARE @DateID integer;" & _
"SET @DateID = ?DateID;" & _
"SELECT TOP 10 * FROM dbo.SomeRecords " & _
"WHERE DateID = @DateID" 
.....
Set DateID = cmd.CreateParameter("?DateID", adInteger, adParamInput)
Run Code Online (Sandbox Code Playgroud)

关于:

既然如此,何必一开始就为它们起名字呢?

好吧,这样您就可以如上所示将它们匹配起来。无论如何,请多次使用它,但请使用sql-server local声明并将其设置在那里,如图所示。