Adodb.Commandを介した次のクエリで名前付きパラメーターを使用しようとしていますが、うまくいきません。
Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1
私が使用したコードはそのようなものです。
Dim cmd
Set cmd = Server.CreateObject("Adodb.Command")
cmd.NamedParameters = True
cmd.CommandType = adCmdText
cmd.CommandText = "Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1"
cmd.Parameters.Append cmd.CreateParameter("@param1", adVarchar, adParamInput, 20, "some text 1")
cmd.Parameters.Append cmd.CreateParameter("@param2", adVarchar, adParamInput, 20, "some text 2")
Set cmd.ActiveConnection = cn
Dim rs
Set rs = cmd.Execute
問題は、これによりRDBMS側でエラーが発生することです。
Microsoft OLE DB Provider for SQL Server error '80040e14'
Must declare the scalar variable "@param1".
クエリがストアドプロシージャ呼び出しであれば問題ありません。したがって、namedparametersは、ストアドプロシージャを呼び出すコマンドオブジェクトにのみ影響すると思います。SQL Server Profilerを使用してクエリを追跡すると、次のクエリが実行されていることがわかりました(パラメーター宣言や値の割り当てがないことに注意してください)。
SQL:BatchStarting Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2)
SQL:BatchCompleted Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2)
ただし、ネイティブの可変クエリでそれを行う必要があります。どうすればよいですか、文字列の連結などなしでそれを行うためのベストプラクティスは何ですか?疑問符付きのクエリを準備したくないし、順序付きのパラメータを渡すのも好きではありません(疑問符付きで名前付きパラメータなしで必要です)そして複数回。どんな助けでも大歓迎です。
誤解に関する最新情報:データベースに依存しない一般的な解決策を探しています。