2

次のようなパラメータ化されたクエリがあります。

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'

パラメーターは56andです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();
    ...
    }

(ここでは、パラメータ156が追加の引数として に渡されますDB.query。)

4

3 に答える 3

6

「キーワード「from」付近の構文が正しくありません」は、文字列を連結して単語間のスペースを忘れてクエリを作成するときに発生する従来のエラーです。ここでは、最初の行の終わり (...videos) と 2 番目の行の始まり (WHERE...) の間にスペースがありません。

于 2013-01-30T05:26:09.733 に答える
2

クエリ テキストが表示され、関数がそのテキストをどのように受け入れるかがわかりますが、これを正確に診断するには、まだ 1 つのことが欠けています: クエリ テキストをコードにどのように配置しますか?

私はあなたがこのようなものを持っていると感じているので、私は尋ねます:

query = "SELECT title, html, shortname FROM dbo.Videos"
      + "WHERE TopicID = ? .... ";

その文字列変数が作成されるとどうなるかに注目してください。次のようになります。

dbo.VideosWHERE TopicID = ? からタイトル、html、短い名前を選択します。....

dbo.Videosと の間には何もないことに注意してくださいWHERE。2 つの行の間に空白を含めませんでした。元のコードの改行は、文字列リテラルの一部ではありません。代わりに次のようなものが必要です。

query = "SELECT title, html, shortname FROM dbo.Videos"
     + " WHERE TopicID = ? .... ";

WHEREキーワードにスペースが追加されていることに注意してください。


追加の提案は、その部分を削除して、テーブル名dbo.だけに使用することです。Videosあなたが持っているものは有効な構文でなければならないことはわかっていますが、異常なことが起こっているに違いありません。もう 1 つ試すことは、テーブルと列の名前を括弧で囲むことです。

于 2013-01-30T05:19:14.553 に答える
1

私は問題を理解したと信じています。これが私の仮説です:

通常、ADO はクエリの構造に基づいて引数の型を推測できるようです。ただし、この場合、準備されたステートメントの引数の 1 つが function のパラメーターでdbo.gradeLevelCheckあるため、型の推論が失敗します。(おそらく、ADO はストアド関数などを理解していないため、引数の型を確認する方法がわかりません。)型を把握できないため、クエリは無効です。

句が削除された場合にこのクエリが機能するように見える理由はまだわかりませんが、ORDER BYとにかくコードを変更する必要があることは明らかです。

于 2013-02-01T19:59:30.003 に答える