我正在尝试比较col1子句中的列@myvar和变量@myvar。这两种方法通常都包含GUID,但也可能具有空值。我想我可以避开这样一个事实:NULL=NULL通过使用WHERE ISNULL(col1, '')=ISNULL(@myvar, '')来计算为FALSE。这将比较两个空字符串,并计算为TRUE。
然而,这将产生以下错误消息:
Msg 8169,级别16,状态2,第3行转换失败时,从字符串转换为unique标识符。
我试过了
DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1同样的错误信息。
两个问题:首先,我试图将一个unique标识符变量(尽管它有一个空值)转换为一个(空!)字符串,而不是相反,正如错误消息所暗示的那样。怎么回事?
第二,是否有更好的方法来表达我需要的WHERE子句,以便比较可能为NULL的unique标识符?
发布于 2015-08-28 23:11:07
因为传递给isnull的第一个参数不是文字,所以它将确定该调用的返回类型,在您的情况下是一个uniqueidentifier。第二个参数''不能转换为这种类型,因此出现了错误。
解决这一问题的一种方法就是显式地检查null:
WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)发布于 2017-03-16 07:19:04
我认为下面的表达式可以用来检查GUID列是否为空。
CAST(0x0 AS UNIQUEIDENTIFIER)有些事像
...WHERE GuidId <> CAST(0x0 AS UNIQUEIDENTIFIER)发布于 2015-08-28 23:12:37
ISNULL不适用于您的原因是,替换值(如果check表达式真的为null)必须隐式转换为check表达式的类型。
您的WHERE子句可以使用col IS NULL AND @var IS NULL检查该状态。
https://stackoverflow.com/questions/32280994
复制相似问题