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 回答