質問

次のように、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」

テーブルエントリを実際に置き換えるので、私はそれをしません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top