0

ちょっとこれにこだわった。名前/値の列を持つテーブルがあります。

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">
&lt;FirstName&gt;First value&lt;/FirstName&gt;&lt;
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>

結果セットにはこれらの空の文字列が数百ある可能性があるため、帯域幅を節約するために名前空間をルート レベルに配置することをお勧めします。これはまったく可能ですか?

4

1 に答える 1

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>"
于 2012-07-13T10:42:55.663 に答える