次のようなパラメータ化されたクエリがあります。
SELECT title, html, shortname FROM dbo.Videos
WHERE Topic_ID = ? AND dbo.gradeLevelCheck(?, Grade_Lower, Grade_Upper) = 1
ORDER BY shortname ASC
ASP から実行すると、次のようなエラーが表示されます。
Incorrect syntax near the keyword 'from'
パラメーターは56
andです1
(つまり、null はありません)。ストアド関数dbo.gradeLevelCheck
は次のようになります。
ALTER FUNCTION [dbo].[gradeLevelCheck]
(
@value int,
@lower int,
@upper int
)
RETURNS int
AS
BEGIN
DECLARE @result int;
IF (@lower IS NULL OR @lower <= @value) AND (@upper IS NULL OR @upper >= @value)
SET @result = 1;
ELSE
SET @result = 0;
RETURN @result;
END
クエリにハードコードされたパラメーターを使用して送信すると、正常に機能します。ORDER BY 句を削除しても問題なく動作します。しかし、私はそれをこの形で機能させることはできません。誰でも理由を理解するのを手伝ってもらえますか?
編集:ここにいくつかの追加の詳細があります。アプリケーションは、JScript を使用した Classic ASP で作成されています。接続は次のように確立されます。
var conn = Server.CreateObject('ADODB.Connection');
var connectionString =
'Provider=SQLOLEDB;' +
'Data Source=' + Settings.dbServer + ';' +
'Initial Catalog=' + Settings.dbCatalog + ';' +
'User Id=' + Settings.dbUser + ';' +
'Password=' + Settings.dbPass + ';' +
'Connect Timeout=15;';
conn.Open(connectionString, conn);
クエリの送信に使用されるコードは次のようになります。
DB.query = function(query) {
...
var cmd = Server.CreateObject("ADODB.Command");
cmd.activeConnection = conn;
cmd.commandText = query;
for (var i = 1; i < arguments.length; i++) {
cmd.Parameters(i-1).value = arguments[i];
}
return cmd.Execute();
...
}
(ここでは、パラメータ1
と56
が追加の引数として に渡されますDB.query
。)