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

时间:2012-03-29 10:17:27

标签: sql-server sql-server-2005 uniqueidentifier

使用SQL Server 2005如何获得以下语句,或者更确切地说是我想要的输出。

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

ParenId是允许uniqueidentifier的{​​{1}},但似乎查询优化器会尝试将NULL转换回''以查找uniqueidentifier行。正如标题所说,这是查询运行员抛出的确切错误信息!!

  • 如何让服务器返回ParentId = NULL
  • 的空字符串

4 个答案:

答案 0 :(得分:63)

SELECT Id   'PatientId',
       ISNULL(CONVERT(varchar(50),ParentId),'')  'ParentId'
FROM Patients

ISNULL总是尝试返回与其第一个参数的类型具有相同数据类型的结果。所以,如果你想让结果成为一个字符串(varchar),你最好确保它是第一个参数的类型。


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

(它通常也是首选,因为它扩展到两个以上的参数)

答案 1 :(得分:8)

Select ID, IsNull(Cast(ParentID as varchar(max)),'') from Patients

这是必需的,因为字段ParentID不是varchar / nvarchar类型。这样就可以了:

Select ID, IsNull(ParentID,'') from Patients

答案 2 :(得分:6)

您需要CAST ParentId作为nvarchar,以便输出始终是相同的数据类型。

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

答案 3 :(得分:0)

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

SELECT Id AS 'PatientId',
       CONCAT(ParentId,'') AS 'ParentId'
FROM Patients

CONCATnull的值转换为空字符串。

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