【问题标题】:Convert NULL to empty string - Conversion failed when converting from a character string to uniqueidentifier将 NULL 转换为空字符串 - 从字符串转换为唯一标识符时转换失败
【发布时间】:2012-03-29 10:17:27
【问题描述】:

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

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

ParenId 是一个uniqueidentifier,它允许NULL,但似乎查询优化器也尝试将'' 转换回uniqueidentifier,用于ParentId = NULL 所在的行。正如标题所说,这是确切的错误信息查询赛跑者扔在我脸上!!

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

【问题讨论】:

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


    【解决方案1】:
    SELECT Id   'PatientId',
           ISNULL(CONVERT(varchar(50),ParentId),'')  'ParentId'
    FROM Patients
    

    ISNULL 总是试图返回一个与它的第一个参数类型具有相同 数据类型的结果。因此,如果您希望结果为字符串 (varchar),最好确保这是第一个参数的类型。


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

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

    【讨论】:

    • 感谢您提供的超出预期的内容。我从您的回答中学到了很多东西将在 4 分钟内将其标记为已回答 Greetz
    • @Damien_The_Unbeliever 我试过 'COALESCE(CONVERT(varchar(50),ParentId),'')' 和 'ISSNULL(CONVERT(varchar(50),ParentId),'')' m 仍然得到一个零而不是一个空单元格。我的 ParentId 是 smallint。
    • 也试过 ISNULL(CAST(ParentId as VARCHAR(50)),'') 和 COALESCE(CAST(ParentId as VARCHAR(50)),'')
    • @bteague - COALESCE 和 ISNULL 用于处理 nulls。不是零。如果您希望 zero 成为空字符串,您可能正在寻找 CASE 表达式。请记住,如果您希望一个结果是空字符串,则需要确保来自 CASE 的所有可能结果也是字符串。 (因为例如 int 不能包含空字符串)
    • @Damien_The_Unbeliever 我的数据点是 smallint,当我尝试将 null 转换为空字符串时,我得到一个零,我不想要零。 ISNULL(CONVERT(varchar(50),ParentID),'') 是正确的。我的查询是由 union all 连接的一系列 3 个查询,我只在第一个代码块中转换了这个字段。最终结果是零。由于第一个代码块的格式通常通过查询中该列的其余部分携带(我认为)格式,我预计它会引发错误而不是忽略我的 varchar 转换。感谢您的宝贵时间。
    【解决方案2】:
    Select ID, IsNull(Cast(ParentID as varchar(max)),'') from Patients
    

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        CONCAT 将 null 值转换为空字符串。

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

        【讨论】:

          猜你喜欢
          • 2013-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-24
          • 2015-04-21
          相关资源
          最近更新 更多