有点坚持这个。我有一个名称/值列表:
NameValue table
-----------------------------------------------------------
Name varchar(100) Value varchar(100)
-----------------------------------------------------------
FirstName First value
SecondName Second value
ThirdName Null or Empty String
etc...
我试图让我的结果看起来像下面的XML,但我不能完全实现。
<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>First value</FirstName>
<SecondName>Second value</SecondName>
<ThirdName xsi:nil="true" />
</MyValues>
为了使动态名称有效,我将XML连接起来并像以下一样转换为XML:
select cast('<' + name + '>' + value + '</' + name + '>' as xml)
from NameValue
for xml raw(''), root('MyValues'), elements xsinil
上述查询生成的此XML不带xsi:nil="true"
<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>First value</FirstName>
<SecondName>Second value</SecondName>
<ThirdName />
</MyValues>
如果我不使用XML,我会留下以下内容:
<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>First value</FirstName><
etc...
我尝试在连接中添加xsi:nil="true"
,但是收到有关缺少的命名空间的错误。我猜这个工作,我将不得不为包含null或空字符串的每一行添加相同的命名空间,因此结果如下所示:
<MyValues>
<FirstName>First value</FirstName>
<SecondName>Second value</SecondName>
<ThirdName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
</MyValues>
结果集中可能有几百个空字符串,所以我更喜欢将命名空间放在根级别以节省带宽。这有可能吗?
答案 0 :(得分:0)
我没有使用FOR XML,而只是将整个XML作为连接字符串。
declare @xml varchar(max)
set @xml = '<MyValues xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
select @xml = '<' + name +
case when len(value) = 0 then 'xsi:nil="true" />'
else '>' + value + '</' + name + '>'
end
from NameValue
select @xml + "</MyValues>"