5

我有很多 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),但它没有做什么我期待着。

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

4

3 回答 3

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)

关于:

在这种情况下,为什么要首先为他们命名

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

于 2012-10-09T11:03:24.003 回答
1

DECLARE @DateID integer;从 SQL 字符串中删除。IE:

cmd.CommandText = "SELECT TOP 10 * FROM dbo.SomeRecords " & _ 
    "WHERE DateID = @DateID"  
于 2012-10-09T09:00:32.130 回答
1

ADO 参数化查询中的参数需要 a?作为占位符,因此:

"SELECT TOP 10 * FROM dbo.SomeRecords WHERE DateID = ?"
于 2012-10-09T09:30:41.197 回答