我试图在col1
条款中比较列@myvar
和变量WHERE
。两者通常都包含GUID,但也可能具有NULL值。我想我可以通过使用NULL=NULL
来解决WHERE ISNULL(col1, '')=ISNULL(@myvar, '')
评估为FALSE的事实。这将比较两个空字符串,并评估为TRUE。
但是,这将产生以下错误消息:
消息8169,级别16,状态2,行3转换从字符串转换为uniqueidentifier时失败。
我试过了
DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
相同的错误消息。
两个问题:首先,我试图将uniqueidentifier变量 - 即使它具有NULL值 - 转换为(空!)字符串,而不是相反,如错误消息所示。是什么赋予了?
第二,有没有更好的方法来说明我需要的WHERE子句,以允许比较可能为NULL的uniqueidentifier?
由于您传递isnull
的第一个参数不是文字null
,它将确定该调用的返回类型,在您的情况下为uniqueidentifier
。第二个参数''
不能转换为这种类型,因此你得到的错误。
解决这个问题的一种方法就是明确检查null
s:
WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
我认为下面的表达式可用于检查GUID列是否为空
CAST(0x0 AS UNIQUEIDENTIFIER)
就像是
...WHERE GuidId <> CAST(0x0 AS UNIQUEIDENTIFIER)
ISNULL
不适合您的原因是替换值(如果检查表达式确实为null,则使用的值)必须可以隐式转换为检查表达式的类型。
您的WHERE
条款可以使用col IS NULL AND @var IS NULL
来检查该状态。
正如其他人所指出的那样,从结果中排除NULL值然后进行比较。您可以使用COALESCE从比较中排除NULL值。
请尝试以下代码:
WHERE ISNULL([Guid], NEWID()) = @myvar
以下是克服此问题的另一种方法:
DECLARE @myvar uniqueidentifier = NEWID()
SELECT * FROM TABLE
Where ISNULL(col1,@myvar) = ISNULL(Col2,@myvar)
这将解决您的错误。从字符串转换为uniqueidentifier
时转换失败。