xml查询帮助返回多个节点

时间:2011-08-17 08:39:10

标签: xml sql-server-2008 xquery

我一直在使用SQL很长一段时间,但新系统要求我学习XQuery。

我有一个很好的搜索,但无法真正找到这个新手答案,我正在尝试查询XML字段,以返回客户端有多个电话号码的多行数据。 XML字段存储在客户端级别,格式为:

   <p1:Telephone>
     <p1:Type code="Home">Home</p1:Type>
     <p1:TelephoneNumber>01234 987654</p1:TelephoneNumber>
   </p1:Telephone>
   <p1:Telephone>
     <p1:Type code="Business">Business</p1:Type>
     <p1:TelephoneNumber>01324 123456</p1:TelephoneNumber>
   </p1:Telephone>

客户端的详细信息在XML之上,但这是我正在努力解决的问题。

我想要的是将数据作为不同的列返回查询分析器,即

    Client A | Home | 01234 987654
    Client A | Business | 01324 1234546
    Client B | .... | ....

有人能指出我正确的方向吗?

非常感谢,

乔恩

2 个答案:

答案 0 :(得分:2)

您可以使用这样的新XML数据类型,假设XML在openshac提供的答案中显示,而YourTable有一个ClientName列和一个XMLCol

;with xmlnamespaces ('http://org.test' as p1)
select X.ClientName,
       T.N.value('p1:Type[1]/@code', 'varchar(25)') as TypeCode,
       T.N.value('p1:Type[1]', 'varchar(25)') as TypeValue,
       T.N.value('p1:TelephoneNumber[1]', 'varchar(25)') as TelephoneNumber
from YourTable as X
  cross apply X.XMLCol.nodes('/root/p1:Telephone') as T(N)

修改

;with xmlnamespaces ('f2.co.uk/f2/1.0' as p1) 
select X.ClientReference, 
       T.N.value('p1:Type[1]/@code', 'varchar(25)') as TypeCode, 
       T.N.value('p1:Type[1]', 'varchar(25)') as TypeValue, 
       T.N.value('p1:TelephoneNumber[1]', 'varchar(25)') as TelephoneNumber 
from #tempa as X 
  cross apply X.[Xml].nodes('//p1:CommunicationChannel/p1:Telephone') AS T(N)

答案 1 :(得分:0)

您尚未包含完整的XML,因此我无法看到您从哪里获取客户信息,但请尝试以下操作:

    DECLARE @xml nvarchar(max) = '<root xmlns:p1="http://org.test">
   <p1:Telephone>
     <p1:Type code="Home">Home</p1:Type>
     <p1:TelephoneNumber>01234 987654</p1:TelephoneNumber>
   </p1:Telephone>
   <p1:Telephone>
     <p1:Type code="Business">Business</p1:Type>
     <p1:TelephoneNumber>01324 123456</p1:TelephoneNumber>
   </p1:Telephone></root>'

    DECLARE @xml_handle int  
    EXEC sp_XML_preparedocument @xml_handle OUTPUT, @xml, '<root xmlns:p1="http://org.test" />'

    SELECT * FROM 
    OPENXML( @xml_handle, '//p1:Telephone') 
    WITH (
        [Type]              varchar(10) './p1:Type',
        [Code]              varchar(10) './p1:Type/@code',
        [TelephoneNumber]   varchar(10) './p1:TelephoneNumber'
    )

  EXEC sp_xml_removedocument @xml_handle    

返回:

<强>类型,代码,TelephoneNumber

Home,Home,01234 9876

商业,商业,01324 1234