SQL Server:uniqueidentifier上的ISNULL

TVo*_*ogt 9 sql sql-server null isnull uniqueidentifier

我试图比较一个子句中的列col1和变量.两者通常都包含GUID,但也可能具有NULL值.我以为我可以通过使用来解决评估为FALSE 的事实.这将比较两个空字符串,并评估为TRUE.@myvarWHERENULL=NULLWHERE ISNULL(col1, '')=ISNULL(@myvar, '')

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

消息8169,级别16,状态2,行3转换从字符串转换为uniqueidentifier时失败.

我试过了

DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
Run Code Online (Sandbox Code Playgroud)

相同的错误消息.

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

第二,有没有更好的方法来说明我需要的WHERE子句,以允许比较可能为NULL的uniqueidentifier?

Mur*_*nik 10

由于您传递的第一个参数isnull不是文字null,因此它将确定该调用的返回类型,uniqueidentifier在您的情况下为a.第二个参数,''不能转换为这种类型,因此你得到的错误.

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

WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
Run Code Online (Sandbox Code Playgroud)

  • 还有第二部分需要牢记.目前,您将列放入函数(如ISNULL),这使得查询优化器无法使用其潜力.看看这个("sargable"):http://stackoverflow.com/q/799584/5089204 (2认同)

Nid*_*eep 8

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

CAST(0x0 AS UNIQUEIDENTIFIER)
Run Code Online (Sandbox Code Playgroud)

就像是

...WHERE GuidId <>  CAST(0x0 AS UNIQUEIDENTIFIER)
Run Code Online (Sandbox Code Playgroud)