Where句でnullable列を使用します
-
13-09-2019 - |
質問
次のように、SQLサーバーのテーブル定義を想定してください。
CREATE TABLE MyTable (
Id UNIQUEIDENTIFIER NULL,
Info VARCHAR(MAX)
)
とクエリ:
DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
SELECT @info = Info
FROM MyTable
WHERE Id = @id
END
その場合、Visual Studio Static Code Analyzerは次のエラーを生成します。
警告:SR0007:Microsoft.performance:nullable列により、最終結果が述語のnullとして評価される可能性があります。
ここで問題はありません。エラーはパフォーマンスに関連しています。 MSDNは、isnull()を使用する必要があると言いますが、nullとの比較は常に間違っていますよね?私は何かが足りないのですか、それとも警告が間違っていますか?
解決
Where句を指していると思います。パラメーターと列の両方がnullになる可能性があると言っています。 nullable列を常に(isnullを介して)定義された値を持っているものに漏洩すると、論理的にはより良い形になります。
そのエラーに関するMicrosoftドキュメントは次のとおりです。
さておき、ヌルはおそらくクエリをスコッシュを遅くするでしょう。
他のヒント
アナライザーはあなたのIFステートメントを考慮していないだけだと思います。
あなたのコードは私には正しいようです。
私はそれが偽の警告だと思います - あなたはそれをケースバイケースで抑制することができますか、それともその特定の警告を完全に?
これを行うとどうなりますか?:
CREATE TABLE MyTable (
Id UNIQUEIDENTIFIER NOT NULL,
Info VARCHAR(MAX)
)
ヌルの比較はセットアップに依存します。
When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN
When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL
returns zero rows even if there are null values in column_name.
A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.
When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.
これは ここから.
IF @id IS NOT NULL
に置き換える必要があります
IF ISNull(@id, -1) <> -1
@ raj:「isnull(@id、-1)<> -1」
テーブルエントリを実際に置き換えるので、私はそれをしません