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