SQL Server:uniqueidentifier上的ISNULL

问题描述 投票:9回答:6

我试图在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?

sql sql-server null uniqueidentifier isnull
6个回答
10
投票

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

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

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

8
投票

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

CAST(0x0 AS UNIQUEIDENTIFIER)

就像是

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

2
投票

ISNULL不适合您的原因是替换值(如果检查表达式确实为null,则使用的值)必须可以隐式转换为检查表达式的类型。

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


2
投票

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


2
投票

请尝试以下代码:

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

0
投票

以下是克服此问题的另一种方法:

DECLARE @myvar uniqueidentifier = NEWID()

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

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

© www.soinside.com 2019 - 2024. All rights reserved.