Question

Supposons une définition de table dans SQL Server comme suit:

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

Et une requête:

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

Dans ce cas, l'analyseur statique de code Visual Studio produit l'erreur suivante:

  

Attention: SR0007:   Microsoft.Performance: Nullable   colonnes peuvent entraîner des résultats finaux à   évaluée comme NULL pour le prédicat.

Je ne vois pas le problème ici. L'erreur est liée à la performance; ISNULL () MSDN dit que je devrais utiliser - mais une égale comparaison avec NULL est toujours faux, non? Est-ce que je manque quelque chose, ou est l'avertissement juste mal?

Était-ce utile?

La solution

Je pense qu'il fait référence à la clause WHERE. Il est dit que les deux vos paramètres et votre colonne peut être NULL, dans ce cas, la clause WHERE n'évalue à true / false. En canalisant votre colonne nullable dans celui qui a toujours une valeur définie (via ISNULL), vous êtes en meilleure forme, sage logique.

est ici la documentation de Microsoft sur cette erreur.

Sur le côté, NULLs font soi-disant requêtes un skosh plus lent.

Autres conseils

Je pense que l'analyseur peut tout simplement pas être pris en compte votre instruction IF.

Votre code semble correct pour moi.

Je pense qu'il est un avertissement faux - vous pouvez le supprimer au cas par cas, ou cet avertissement particulier complètement

?

Qu'est-ce qui se passe quand vous faites ceci:

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

comparaison de Null dépend de la configuration.

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.

d'ici .

IF @id IS NOT NULL

devrait être remplacé par

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

@ Raj: "SI isNull (@id, -1) <> -1"

Je ne le ferais pas car il remplace en fait l'entrée de table

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top