Verwenden von Nullable -Spalten in einer WHERE -Klausel
-
13-09-2019 - |
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?
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