有点卡在这个上。我有一个包含名称/值列的表:
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>
结果集中可能有几百个这样的空字符串,所以我更愿意将命名空间放在根级别以节省带宽。这是可能吗?