如何从包含XML命名空间的XML列中获取数据(SQL Server 2005)

4
我经过大量的谷歌搜索,却没有找到答案。我无法从包含来自Web服务的数据的XML列中检索数据,使用的是sp_OAGetProperty
XML列包含...
<ArrayOfCustomerInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
   <Customer CustCode="001">
      <CustName>John</CustName>
      <Queues>
         <Q>
            <No>10</No>
            <Line>1</Line>
         </Q>
      </Queues>
   </Customer> 
</ArrayOfCustomerInfo>

当我执行以下语句时,得到了NULL的返回值(但是如果我删除所有XML命名空间,则可以正常工作):
SELECT a.b.value('@CustCode','varchar(4)') AS Code
   ,a.b.value('CustName[1]','varchar(20)') AS Name
   ,c.d.value('No[1]','int') AS QNo
   ,c.d.value('(Line)[1]','int') AS QLine
FROM  PGHRMS_Employees x
CROSS APPLY x.data.nodes('/ArrayOfCustomerInfo/Customer') AS a(b)
CROSS APPLY a.b.nodes('Queues/Q') AS c(d)

请给我一些建议。我需要在SQL SERVER上实现(这个功能):(

如果有人想要复制它,我已经将脚本粘贴在: http://pastebin.com/ueZGidyL

非常感谢您提前的帮助!!!

1个回答

3

试试这个:

;WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org/')
SELECT
    Code = XC1.value('@CustCode', 'varchar(4)'),
    Name = XC1.value('CustName[1]', 'varchar(20)'),
    QNo = XC2.value('No[1]', 'int') ,
    QLine = XC2.value('(Line)[1]','int') 
FROM
    PGHRMS_Employees 
CROSS APPLY
    XmlContent.nodes('/ArrayOfCustomerInfo/Customer') AS XT1(XC1)
CROSS APPLY 
    XC1.nodes('Queues/Q') AS XT2(XC2)

使用 WITH XMLNAMESPACES 结构,您可以定义一些XML命名空间以供以下T-SQL语句使用 - 默认或带前缀的命名空间。


谢谢您,marc_s。这个解决方案正是我所需要的。 - SweNz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接