【问题标题】:SQL Server convert NULL to empty string in select *SQL Server 在 select * 中将 NULL 转换为空字符串
【发布时间】:2014-10-01 20:57:46
【问题描述】:

我需要执行以下操作:

 SELECT * FROM [MY_TVF](9186)
 FOR XML AUTO, ELEMENTS

并将所有 NULL 值替换为空字符串 '' 以将它们包含在 XML 中。我知道我可以通过设置ELEMENTS XSINIL 来吐出具有xsi:nil="true" 属性的元素,但我不希望这样。

我发现了这个问题:Convert NULL to Empty String SQL Server,答案说我可以在查询周围使用ISNULL()。我是这样试的:

ISNULL((SELECT * FROM [MY_TVF](9186)),'')
FOR XML AUTO,ELEMENTS

但我无法让它工作。我收到以下错误:

消息 102,级别 15,状态 1,第 1 行 ',' 附近的语法不正确。

我可以做些什么来简单地将所有 NULL 值替换为空字符串,以便它们包含在 XML 中?

编辑

没有办法用列名替换*。我们使用 TVF 是有原因的,大约有 40 列,它们可能会随着时间而改变。我的查询只是选择所有内容并将其作为 XML 返回。

【问题讨论】:

  • 如果您单独列出列,您可以使用isnull()coalesce()。它们不会同时处理多个列。
  • @GordonLinoff 我知道,但是大约有 40 列,有些列的名称很长。更重要的是,它们可以改变,因此它们被指定为 TVF。我需要那个*
  • @MDeSchaepmeester 。 . .那么就需要使用动态SQL来获取所有的列名。
  • 你为什么不改变对列使用 COALESCE 或 ISNULL 的 TVF(或制作副本),而不是跺脚?
  • “无法用列名替换 *。我们使用 TVF 是有原因的,大约有 40 列,它们可能会随着时间而改变。”如果列发生变化,只需进入并更改您的 SQL 语句。这是开发世界中非常普遍的做法。出于多种原因,使用SELECT * 是一个坏主意,而您现在遇到了其中一个。

标签: sql sql-server xml isnull null-coalescing


【解决方案1】:

我已经删除了我之前的答案,这是最新的一个:

Declare @ColName as Varchar(max)
SEt @ColName=''
SELECT  @ColName= COALESCE( @ColName + ' ISNULL(' +c.name + ','''') ','', '') +
c.name + ', ' 
FROM sysobjects o
JOIN syscolumns c ON o.id = c.id
WHERE o.xtype = 'U'
AND (o.name ='tbName')
SEt @ColName=  ( 'Select ' + SUBSTRING(@ColName,0,LEN(@ColName)-1) + ' FROM tbName')
print @colname
EXEC(@ColName)

【讨论】:

  • 这是几乎所有 SQL 的首选方法。 OP 可能永远不必为 2014 年奇怪的左/右/完全连接执行此操作。ISNULL 既不便携,也不可扩展。
【解决方案2】:

改掉SELECT *的习惯

看看这是否有效。

SELECT Col1,Col2,Col3,Col4,Col5
FROM
(
SELECT 
ISNULL(Col1,'') Col1,
ISNULL(Col2,'') Col2,
ISNULL(Col3,'') Col3,
ISNULL(Col4,'') Col4,
ISNULL(Col5,'') Col5
FROM [MY_TVF](9186)
) T
FOR XML AUTO,ELEMENTS

【讨论】:

  • 抱歉,将我的评论视为对 Gordon Linoff 的回应。我需要*。有 40 多列,我真的需要所有数据。如果这不是证明使用* 的好情况,我不知道是什么。
  • 我明白了。如果您有一个更改列名的来源,那么您的处境就很糟糕。
  • 我不确定您的意思是什么功能 - 重命名列?重命名列并没有错,只是如果您有一个数据源,您不能指望具有相同名称或数据类型或相同列数的特定列,它通常会导致问题。但是您的问题中没有足够的信息来真正对此发表任何坚定的声明。无论如何,对不起,我无法再提供任何帮助。如果是TVF,不能把ISNULL逻辑放在那里吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多