Frage

Nehmen Sie eine Tabellendefinition in SQL Server wie folgt an:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NULL,
  Info VARCHAR(MAX)
)

Und eine Frage:

DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
  SELECT @info = Info
    FROM MyTable
    WHERE Id = @id
END

In diesem Fall erzeugt der Visual Studio Static Code Analyzer den folgenden Fehler:

WARNUNG: SR0007: Microsoft.

Ich sehe das Problem hier nicht. Der Fehler hängt mit der Leistung zusammen; MSDN sagt, ich sollte isnull () verwenden - aber ein Gleichberechtigungsvergleich gegen Null ist immer falsch, oder? Vermisse ich etwas oder ist die Warnung einfach falsch?

War es hilfreich?

Lösung

Ich denke, es bezieht sich auf die Where -Klausel. Es heißt, dass sowohl Ihr Parameter als auch Ihre Spalte null sein können. In diesem Fall wird in diesem Fall Ihre Where -Klausel nicht mehr auf True/False ausgewertet. Indem Sie Ihre nullierbare Spalte in einer, die immer einen Wert definiert hat, (über ISNull), sind Sie in besserer Form, logisch.

Hier ist die Microsoft -Dokumentation zu diesem Fehler.

Nebenbei machen Nulls angeblich Anfragen zu einem Skosh langsamer.

Andere Tipps

Ich denke, der Analysator könnte Ihre IF -Erklärung möglicherweise nicht berücksichtigen.

Ihr Code scheint mir richtig zu sein.

Ich denke, es ist eine falsche Warnung-können Sie sie von Fall zu Fall oder diese bestimmte Warnung vollständig unterdrücken?

Was passiert, wenn Sie das tun ?:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)

Der NULL -Vergleich hängt vom Setup ab.

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.

Das ist von hier.

IF @id IS NOT NULL

sollte durch ersetzt werden durch

IF ISNull(@id, -1) <> -1

@ Raj: "Wenn isnull (@id, -1) <> -1"

Ich würde es nicht tun, da es den Tischeintrag tatsächlich ersetzt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top