在vba中使用ADODB在SQL中命名variables

我有很多SQL脚本,其中许多使用各种不同的variables,我希望能够直接把结果放到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名logging),所以显然我没有正确地将VBA的variables的值传递给SQL,但我不得不承认,我几乎卡住了。

当然有东西被传入到SQL中(如果我在SQL中将variables@DateID的types更改为datetime,那么我会得到一个SQL Server算术溢出错误,从尝试将某些东西转换为datetime),但是它没有执行我期待着

我想有两个问题:有没有办法解决这个代码? 是否有更好的方式来实现一开始所描述的总体目标?

尝试这个

 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声明,并在那里设置它,如图所示。

删除DECLARE @DateID integer; 来自SQLstring。 即:

 cmd.CommandText = "SELECT TOP 10 * FROM dbo.SomeRecords " & _ "WHERE DateID = @DateID" 

ADO参数化查询中的参数需要一个? 作为占位符如此:

 "SELECT TOP 10 * FROM dbo.SomeRecords WHERE DateID = ?"