web-dev-qa-db-fra.com

SQL Server: ISNULL sur uniqueidentifier

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?

9
TVogt

É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 nulls:

WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
10
Mureinik

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)
6
NidhinSPradeep

Essayez le code suivant: 

WHERE ISNULL([Guid], NEWID()) = @myvar 
2
Sanjeev Gaur

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.

2
Emacs User

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.

2
Amit

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.

0
dasarghya