5

多くの 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 に渡されています (変数 @DateID の型を SQL で datetime に変更すると、何かを datetime に変換しようとして、SQL Server 算術オーバーフロー エラーが発生します)。私は期待していました。

2 つの質問があると思います: このコードを修正する方法はありますか? 最初に説明した一般的な目標を達成するためのより良い方法はありますか?

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)

Re:

その場合、なぜそもそも名前を付ける必要があるのですか

さて、上記のようにそれらを一致させることができます。ぜひ何度も使ってください。ただし、sql-server local宣言を使用して、示されているようにそこに設定してください。

于 2012-10-09T11:03:24.003 に答える
1

ADO パラメーター化クエリのパラメーターは、?プレースホルダーとして必要です。

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

DECLARE @DateID integer;SQL 文字列から を削除します。すなわち:

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