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
。第二个参数 ''
无法转换为这种类型,因此会出现错误。
解决此问题的一种方法是明确检查 null
s:
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
.
时转换失败
我正在尝试比较 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
。第二个参数 ''
无法转换为这种类型,因此会出现错误。
解决此问题的一种方法是明确检查 null
s:
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
.