SQL 服务器:唯一标识符上的 ISNULL

SQL Server: ISNULL on uniqueidentifier

我正在尝试比较 WHERE 子句中的列 col1 和变量 @myvar。两者通常都包含 GUID,但也可能有 NULL 值。 我想我可以通过使用 WHERE ISNULL(col1, '')=ISNULL(@myvar, '') 来绕过 NULL=NULL 计算结果为 FALSE 的事实。那将比较两个空字符串,并评估为 TRUE。

但是,这将产生以下错误消息:

Msg 8169, Level 16, State 2, Line 3 Conversion failed when converting from a character string to uniqueidentifier.

我试过了

DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1

同样的错误信息。

两个问题: 首先,我试图将一个 uniqueidentifier 变量——即使它有一个 NULL 值——转换为一个(空!)字符串,而不是相反,正如错误消息所暗示的那样。是什么赋予了?

其次,是否有更好的方式来表达我需要的 WHERE 子句,以允许比较可能为 NULL 的唯一标识符?

由于您传递的第一个参数 isnull 不是 文字 null,它将确定该调用的 return 类型,在你的情况下是 uniqueidentifier。第二个参数 '' 无法转换为这种类型,因此会出现错误。

解决此问题的一种方法是明确检查 nulls:

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

ISNULL 对您不起作用的原因是替换值(检查表达式确实为 null 时要使用的值)必须可以隐式转换为检查表达式的类型。

您的 WHERE 子句可以使用 col IS NULL AND @var IS NULL 来检查该状态。

正如其他人指出的那样,从结果中排除 NULL 值,然后进行比较。您可以使用 COALESCE 从比较中排除 NULL 值。

尝试以下代码:

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

我认为下面的表达式可用于检查 GUID 列是否为空

CAST(0x0 AS UNIQUEIDENTIFIER)

类似

的东西
...WHERE GuidId <>  CAST(0x0 AS UNIQUEIDENTIFIER)

这是解决此问题的另一种方法:

DECLARE @myvar uniqueidentifier = NEWID()

SELECT * FROM TABLE
Where ISNULL(col1,@myvar) = ISNULL(Col2,@myvar)

这将解决您的错误。从字符串转换为 uniqueidentifier.

时转换失败