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. J'ai pensé que je pourrais contourner le fait que NULL=NULL évalue à FALSE en utilisant WHERE ISNULL(col1, '')=ISNULL(@myvar, '') . Cela comparerait deux strings vides à la place et évaluerait TRUE.

Cela produira cependant le message d'erreur suivant:

Msg 8169, niveau 16, état 2, ligne 3 La conversion a échoué lors de la conversion d'une string 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: Premièrement, j'essaie de convertir une variable uniqueidentifier – même si elle a une valeur NULL – en une string (vide!), Et non l'inverse, comme le suggère le message d'erreur. Ce qui donne?

Deuxièmement, y a-t-il une meilleure façon de décrire la clause WHERE dont j'ai besoin pour permettre de comparer des identifiants uniques qui pourraient être NULL?

Puisque le premier argument que vous isnull n'est pas un null littéral , il déterminera le type de return 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 façon de contourner cela est de vérifier explicitement les null s:

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

La raison ISNULL laquelle ISNULL ne fonctionne pas pour vous est que la valeur de rlocation (la valeur à utiliser si l'expression de vérification est vraiment nulle) doit être implicitement convertible au type de l'expression de vérification.

Votre clause WHERE peut utiliser un col IS NULL AND @var IS NULL pour vérifier cet état.

Comme d'autres l'ont souligné, excluez les valeurs NULL des résultats et ALORS faites la comparaison. Vous pouvez utiliser COALESCE pour exclure les valeurs NULL des comparaisons.

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