Utilizzando le colonne nullable in una clausola WHERE
-
13-09-2019 - |
Domanda
Si supponga una definizione di tabella in SQL Server come segue:
CREATE TABLE MyTable (
Id UNIQUEIDENTIFIER NULL,
Info VARCHAR(MAX)
)
E una query:
DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
SELECT @info = Info
FROM MyTable
WHERE Id = @id
END
In questo caso, Visual Studio analizzatore di codice statico produce il seguente errore:
Attenzione: SR0007: Microsoft.Performance: Nullable colonne possono causare risultati finali siano valutato come NULL per il predicato.
Non vedo il problema qui. L'errore è legato alla performance; MSDN dice che dovrei usare ISNULL () - ma un uguale confronto con NULL è sempre falso, giusto? Mi sto perdendo qualcosa, o è l'avvertimento solo sbagliato?
Soluzione
Penso che riferendosi alla clausola WHERE. Si dice che sia il parametro e la colonna possono essere NULL, nel qual caso il tuo clausola WHERE non restituisce true / false. Con incanalando la colonna nullable in uno che ha sempre un valore definito (via ISNULL), sei più in forma, logica-saggio.
Ecco la documentazione di Microsoft su tale errore.
In parte, i NULL presumibilmente di eseguire query con uno skosh più lenti.
Altri suggerimenti
Credo che l'analizzatore potrebbe semplicemente non essere tenuto in considerazione la vostra istruzione IF.
Il tuo codice sembra corretto per me.
Credo che sia un avvertimento spuria - si può sopprimere su una base caso per caso, o di quel particolare allarme completamente
?Che cosa succede quando si esegue questa operazione:?
CREATE TABLE MyTable (
Id UNIQUEIDENTIFIER NOT NULL,
Info VARCHAR(MAX)
)
confronto Null dipende dalla configurazione.
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.
Questa è da qui .
IF @id IS NOT NULL
dovrebbe essere sostituito con
IF ISNull(@id, -1) <> -1
@ Raj: "IF ISNULL (@id, -1) <> -1"
Io non lo farei come realmente sostituisce la voce della tabella