0

複数の列を持つテーブルがあります。これらの値のパラメーターが null でない場合、これらの値のそれぞれに対して Select * ステートメントをフィルター処理するストアド プロシージャが必要です。SQLサーバーの文字列などを書く必要がありますか?そのパラメーターがnullでない場合は、パラメーター値を文字列に追加するだけですか? それとも、そのようなことのためのより単純な組み込みメカニズムがありますか? Oracle の文字列のことをしなければならないことはわかっています。しかし、ms sql サーバーは常に、よりユーザーフレンドリーであると感じています。飛び込む前にまずチェックしようと思いました。

ありがとう

4

1 に答える 1

5

colが null 可能ではない、またはそうであり、NULL 行を一致させたくない場合の簡単なルート:

WHERE col LIKE COALESCE(@param, col)
-- or the longer version:
WHERE (col LIKE @param OR @param IS NULL)

@param(どちらかNULLまたはのようなものはどこにありますか'%asdf%'。)

colが null 可能で、 NULL 行を一致さたい場合は、次を試すことができます。

WHERE COALESCE(col, 'x') LIKE COALESCE(@param, col, 'x')

これを行う方法は他にもあります。これは、パラメーター化の設定と、最初にキャッシュされたときに使用されるパラメーターに基づいて不適切な計画につながる可能性があるためです (これにより、「パラメーター スニッフィング」が原因で計画の選択が不適切になる可能性があります)。WHEREとにかく、句がテーブルスキャンを強制するため、ここではおそらくほとんど無関係です。

計画の品質が問題になる場合の一般的な代替手段は、動的 SQL を使用することです。

DECLARE @sql NVARCHAR(MAX) = N'SELECT ... FROM ... WHERE 1 = 1';

IF @param IS NOT NULL
BEGIN
  SET @sql += ' AND col LIKE ''' + REPLACE(@param, '''', '''''') + '%''';
END

このような場合、optimize for ad hoc workloads設定が有効になっていることを確認すると役立ちます。

パラメータ スニッフィングと動的 SQL の詳細については、Erland Sommarskog による次の投稿を参照してください。

http://www.sommarskog.se/query-plan-mysteries.html
http://www.sommarskog.se/dynamic_sql.html

于 2013-01-22T15:00:47.640 に答える