2012-07-12 36 views
0

有點卡在這一個。我有一個名稱/值列的表:FOR XSINIL使用動態節點名稱

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> 

要獲得動態名稱的工作,我Concat的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> 

有可能是在結果集中有幾百個這樣的空字符串,所以我寧願將該名稱空間放在根級別以節省帶寬。這是可能嗎?

回答

0

而不是使用FOR XML,我只是將整個XML作爲concatinated字符串。

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>"