我有一些遗留代码类似于:
...
'<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>
...
谢谢!
答案 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"',''))