web-dev-qa-db-ja.com

sp_executesql:パラメータ化できるもの

Sp_executesqlの呼び出しでパラメーター化できるものとパラメーター化できないものを示す明確なリストが公開されていますか?.

たとえば、述語はできますが、テーブル名はできません。 TOPの行数:

exec sp_executesql @stmt =
    N'SELECT TOP(@n) a, b
    FROM (VALUES(1,2)) v(a,b)',
    @params = N'@n int',
    @n = 10

enter image description here

MAXDOPでは次のことはできません。

exec sp_executesql @stmt =
    N'SELECT TOP(10) a, b
    FROM (VALUES(1,2)) v(a,b)
    OPTION (MAXDOP @n)',
    @params = N'@n int',
    @n = 10

メッセージ102、レベル15、状態1、行8 '@n'付近の構文が正しくありません。

機能するものと機能しないものの例はもっとたくさんあると思います。試行錯誤をなくすための信頼できるリストを探しています。

4
user1443098

バックグラウンド

これらが機能しないことがある理由は、sp_executesqlに固有のものではなく、SQL Serverでの変数の動作方法にあります。ローカル変数を使用し、MAXOPにsp_executesqlを使用しない場合、コマンドは機能しません。

ドキュメント

変数は式でのみ使用でき、オブジェクト名やキーワードの代わりには使用できません。

そして は次のように定義されます:

... SQL Serverデータベースエンジンが単一のデータ値を取得するために評価する記号と演算子の組み合わせ。単純な式は、単一の定数、変数、列、またはスカラー関数にすることができます。演算子を使用すると、2つ以上の単純な式を複雑な式に結合できます。

SQL Serverに非常に精通している人にとっては、上記の説明は理にかなっており、おそらくこれ以上の説明は不要ですが、この定義に欠けている可能性があることがわかります。特にTOPの使用法は実際にはlook式とは異なります(値が指定されていても is one )。

簡単なこと

上記を単純化するのは愚か者の用事かもしれませんが、私はそれに打撃を与えます。

より説明的で役立つlooseガイドは次のとおりです。

パラメータ化された値は、クエリの結果に影響を与える場合に有効です。

つまり、次の例は結果に影響を与えるため、有効です(どの行、何行返されるか、返される値など)。ただし、クエリはdoing本質的に同じこと。これは、クエリ結果を変更するがクエリは変更しない式で使用されているためです。

SELECT * FROM Table WHERE Col = @n;
SELECT TOP(@N) * FROM Table;
SET @var = @n;

これらは、クエリのコンテキスト、エンジン設定を変更するため、または異なるクエリになるため、無効ですが、一般に、これらの領域のいずれかを変更するには、カスタムプロシージャ、キーワード、関数を使用するか、クエリで使用されるオブジェクトを変更することにより、notを使用します。表現。

SELECT * FROM Table OPTION (MAXDOP @n);
USE @n; --Change db context
SELECT * FROM @n;
6
LowlyDBA