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