3

SQLServerのテーブル定義を次のように想定します。

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

その場合、VisualStudio静的コードアナライザーは次のエラーを生成します。

警告:SR0007:Microsoft.Performance:NULL可能列により、述語の最終結果がNULLとして評価される可能性があります。

ここでは問題はわかりません。エラーはパフォーマンスに関連しています。MSDNはISNULL()を使用する必要があると言っていますが、NULLに対するequals比較は常にfalseですよね?私は何かが足りないのですか、それとも警告が間違っているのですか?

4

6 に答える 6

4

WHERE句を参照していると思います。パラメータと列の両方が NULL になる可能性があると言っています。その場合、WHERE 句は true/false に評価されなくなります。null 許容列を (ISNULL を介して) 常に値が定義されている列に集中させることで、論理的により良い状態になります。

そのエラーに関する Microsoft のドキュメントは次のとおりです。

余談ですが、NULL はおそらくクエリを skosh 遅くします。

于 2009-12-05T13:03:49.070 に答える
1

これは誤った警告だと思います。ケースバイケースで、またはその特定の警告を完全に抑制できますか?

これを行うとどうなりますか?:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)
于 2009-12-05T17:06:20.470 に答える
1

アナライザーが IF ステートメントを考慮していない可能性があると思います。

あなたのコードは私には正しいようです。

于 2009-12-05T12:59:54.647 に答える
1

Null 比較は設定に依存します。

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.

ここからです。

于 2009-12-05T13:37:59.473 に答える
-2
IF @id IS NOT NULL

に置き換える必要があります

IF ISNull(@id, -1) <> -1
于 2009-12-05T12:47:17.663 に答える
-3

@ Raj: "IF ISNull(@id, -1) <> -1"

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

于 2009-12-05T13:03:02.207 に答える