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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top