来自ntext Column的SQL 2008 SP1 XML值

时间:2014-01-15 10:49:25

标签: sql sql-server xml

我有一个包含以下xml的列:

<obj xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:vim25" versionId="5.1" xsi:type="ArrayOfKeyAnyValue">
  <KeyAnyValue xsi:type="KeyAnyValue">
    <key>1</key>
    <value xsi:type="xsd:string">naa.6019cbc1a09e175d370df5320b00803a</value>
  </KeyAnyValue>
  <KeyAnyValue xsi:type="KeyAnyValue">
    <key>2</key>
    <value xsi:type="xsd:string">6215</value>
  </KeyAnyValue>
  <KeyAnyValue xsi:type="KeyAnyValue">
    <key>3</key>
    <value xsi:type="xsd:string">1291898</value>
  </KeyAnyValue>
</obj>

我希望将每个键值作为单独的列返回。我试过了:

SELECT [table].[column1]
  ,CONVERT(xml, [table].[column1]).value('(/obj/KeyAnyValue[1]/value)[1]', 'nvarchar(max)') As KeyValue
from [table]

这只返回NULL。我有正确的XML路径吗?

确实有些简单,我做错了,非常感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

你的XPath表达式必须说出它正在使用的命名空间:

declare @data xml = '<obj xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                          xmlns="urn:vim25" versionId="5.1" 
                          xsi:type="ArrayOfKeyAnyValue">
  <KeyAnyValue xsi:type="KeyAnyValue">
    <key>1</key>
    <value xsi:type="xsd:string">naa.6019cbc1a09e175d370df5320b00803a</value>
  </KeyAnyValue>
  <KeyAnyValue xsi:type="KeyAnyValue">
    <key>2</key>
    <value xsi:type="xsd:string">6215</value>
  </KeyAnyValue>
  <KeyAnyValue xsi:type="KeyAnyValue">
    <key>3</key>
    <value xsi:type="xsd:string">1291898</value>
  </KeyAnyValue>
</obj>'

select @data.value('declare namespace a="urn:vim25";
(/a:obj/a:KeyAnyValue[1]/a:value)[1]', 'nvarchar(max)')

产地:

naa.6019cbc1a09e175d370df5320b00803a