J'essaie de comparer une colonne col1
et une variable @myvar
dans une clause WHERE
. Les deux contiennent généralement des GUID, mais peuvent également avoir des valeurs NULL. Je pensais pouvoir contourner le fait que NULL=NULL
est évalué à FALSE en utilisant WHERE ISNULL(col1, '')=ISNULL(@myvar, '')
. Cela permettrait de comparer deux chaînes vides à la place et d'évaluer TRUE.
Cela produira toutefois le message d'erreur suivant:
Msg 8169, Niveau 16, État 2, Ligne 3 La conversion a échoué lors de la conversion de D’une chaîne de caractères en identificateur unique.
J'ai essayé
DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
Même message d'erreur.
Deux questions: En premier lieu, j'essaie de convertir une variable uniqueidentifier - même si elle a une valeur NULL - en une chaîne (vide!), Et non l'inverse, comme l'indique le message d'erreur. Ce qui donne?
Deuxièmement, existe-t-il un meilleur moyen de Word que la clause WHERE dont j'ai besoin, afin de permettre la comparaison d'identificateurs uniques qui pourraient être NULL?
Étant donné que le premier argument que vous passez isnull
n'est pas un literal null
, il déterminera le type de retour de cet appel, un uniqueidentifier
dans votre cas. Le second argument, ''
, ne peut pas être converti en ce type, d'où l'erreur que vous obtenez.
Une solution consiste simplement à vérifier explicitement null
s:
WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
Je pense que l'expression ci-dessous peut être utilisée pour vérifier si la colonne GUID est vide
CAST(0x0 AS UNIQUEIDENTIFIER)
quelque chose comme
...WHERE GuidId <> CAST(0x0 AS UNIQUEIDENTIFIER)
Essayez le code suivant:
WHERE ISNULL([Guid], NEWID()) = @myvar
Comme d'autres l'ont souligné, excluez les valeurs NULL des résultats et ALORS effectuez la comparaison. Vous pouvez utiliser COALESCE pour exclure les valeurs NULL des comparaisons.
La raison pour laquelle ISNULL
ne fonctionne pas pour vous est que la valeur de remplacement (la valeur à utiliser si l'expression de contrôle est réellement null) doit être implicitement convertible en type de l'expression de contrôle.
Votre clause WHERE
peut utiliser un col IS NULL AND @var IS NULL
pour vérifier cet état.
Voici un autre moyen de surmonter ce problème:
DECLARE @myvar uniqueidentifier = NEWID()
SELECT * FROM TABLE
Where ISNULL(col1,@myvar) = ISNULL(Col2,@myvar)
Cela résoudra votre erreur. La conversion a échoué lors de la conversion d'une chaîne de caractères en uniqueidentifier
.