FOR XML子句中的NULL元素/ XSINIL的替代

时间:2010-09-27 04:52:55

标签: sql xml tsql

我有一些遗留代码类似于:

 ...
 '<field1>' +   
 case when field1 is null then '' else cast( field1 as varchar ) end +   
 '</field1>' +  
 ...

为空元素生成以下XML:

 ....
 <field1></field1>
 ...

我正在用FOR XML替换查询:

 SELECT field1, 
 ...
 FOR XML RAW, ELEMENTS

现在,这不会为具有NULL值的列输出元素。我知道XSINIL:

 FOR XML RAW, ELEMENTS XSINIL

但是这会生成一个命名空的空XML元素,它与读取此输出的遗留代码不兼容。

 ...
 <field1 xsi:nil="true" />
 ...

有关在使用FOR XML子句时生成以下格式的任何建议吗?

 ....
 <field1></field1>
 ...

谢谢!

3 个答案:

答案 0 :(得分:4)

一个非常简单的解决方案是:在ELEMENTS之后不要指定“XSINIL”!

 FOR XML RAW, ELEMENTS

在这种情况下,对于任何NULL值,您都不会获得XML条目。

如果你真的想要一个空的XML标签,你需要使用这样的东西:

SELECT
   ......
   ISNULL(CAST(field1 AS VARCHAR(100)), '') AS 'field1',
   ......
FROM dbo.YourTable
FOR XML RAW, ELEMENTS

因此将空field1转换为空字符串,从而将其序列化为XML。

答案 1 :(得分:2)

您可以使用空字符串加倍空值的列。这些值将被连接起来,空字符串确保您始终拥有构建节点的内容。

您需要使用for xml path代替for xml raw

declare @T table
(
  Col1 int,
  Col2 int
)

insert into @T values(1, 2)
insert into @T values(1, null)
insert into @T values(null, 2)
insert into @T values(null, null)

select Col1,
       '' as Col1,
       Col2,
       '' as Col2
from @T
for xml path('row')

结果:

<row>
  <Col1>1</Col1>
  <Col2>2</Col2>
</row>
<row>
  <Col1>1</Col1>
  <Col2></Col2>
</row>
<row>
  <Col1></Col1>
  <Col2>2</Col2>
</row>
<row>
  <Col1></Col1>
  <Col2></Col2>
</row>

答案 2 :(得分:0)

你可以通过这个来避免劳动工作

    declare @Var varchar(max)
set @Var=(select 
FirstName,
LastName,
Middldle_Name
From Customer 
FOR XML AUTO, ELEMENTS xsinil , ROOT('Customer')
)
select CONVERT(xml,REPLACE(@Var,' xsi:nil="true"',''))