ちょっとこれにこだわった。名前/値の列を持つテーブルがあります。
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>
結果セットにはこれらの空の文字列が数百ある可能性があるため、帯域幅を節約するために名前空間をルート レベルに配置することをお勧めします。これはまったく可能ですか?