将NULL转换为空字符串-从字符串转换为uniqueidentifier时转换失败

问题描述 投票:33回答:4

使用SQL Server 2005如何获取以下语句,或者根据需要获取输出。

SELECT Id   'PatientId',
       ISNULL(ParentId,'')  'ParentId'
FROM Patients

ParenId是允许使用uniqueidentifierNULL,但似乎查询优化器还会尝试将''所在的行也将uniqueidentifier转换回ParentId = NULL。正如标题所述,这是查询的确切错误信息跑步者向我投掷!

  • 我如何使服务器返回ParentId = NULL的空字符串
sql-server sql-server-2005 uniqueidentifier
4个回答
63
投票
SELECT Id   'PatientId',
       ISNULL(CONVERT(varchar(50),ParentId),'')  'ParentId'
FROM Patients

ISNULL总是尝试返回具有same数据类型作为其第一个参数类型的结果。因此,如果您希望结果为字符串(ISNULL),则最好确保这是第一个参数的类型。


varchar通常比COALESCE更好用,因为它考虑all参数数据类型并应用适当的COALESCE规则来确定最终的结果数据类型。不幸的是,在这种情况下,ISNULL的优先级高于precedence,所以无济于事。

(由于它扩展到两个以上的参数,因此通常也更受欢迎)


8
投票
uniqueidentifier

这是必需的,因为字段ParentID不是varchar / nvarchar类型。这将达到目的:

varchar

6
投票

您需要将Select ID, IsNull(Cast(ParentID as varchar(max)),'') from Patients Select ID, IsNull(ParentID,'') from Patients 作为CAST,以便输出始终是相同的数据类型。

ParentId

0
投票

从Sql Server 2012开始:字符串串联函数nvarchar隐式转换为字符串。因此,另一个选择是

SELECT Id   'PatientId',
       ISNULL(CAST(ParentId as nvarchar(100)),'')  'ParentId'
FROM Patients

[CONCATCONCAT值转换为空字符串。

有些人会认为这很hacky,因为它只是利用了函数的副作用,而手本身的任务不需要该函数本身。

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