Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回多个节点的xml查询帮助_Xml_Sql Server 2008_Xquery - Fatal编程技术网

返回多个节点的xml查询帮助

返回多个节点的xml查询帮助,xml,sql-server-2008,xquery,Xml,Sql Server 2008,Xquery,我已经使用SQL很长时间了,但是新系统需要我学习XQuery 我已经进行了很好的搜索,但实际上找不到这个问题的新手答案,我正在尝试查询一个XML字段以返回多行数据,其中一个客户机有多个电话号码。XML字段存储在客户端级别,格式如下: <p1:Telephone> <p1:Type code="Home">Home</p1:Type> <p1:TelephoneNumber>01234 987654</p1:Telep

我已经使用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>
有人能为我指出正确的方向吗

非常感谢,


Jon

您尚未包含完整的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    
返回:

类型、代码、电话号码

家,家,012349876


Business,Business,01324 1234

您可以像这样使用新的XML数据类型,假设XML与提供的答案类似,并且您的表有一个ClientName列和一个XMLCol列

编辑


谢谢openshac,这就成功了。我将进一步调查这些程序。它可以通过一系列交叉应用程序来实现,还是我不应该去的地方?谢谢Mikael,我想我们离得越来越近了,我已经稍微调整了查询,以适应xml中更高级别的结构,称为CommunicaionChannel。当我跑的时候对不起,当我跑的时候;将xmlnamespace作为p1选择X.ClientReference,将T.N.value'p1:Type[1]/@code',将varchar25'作为TypeCode,将T.N.value'p1:Type[1]',将varchar25'作为TypeValue,-T.N.value'p1:TelephoneNumber[1]',将varchar25'作为tempa中的电话号码作为X交叉应用X.[Xml].nodes“//p1:CommunicationChannel/p1:Telephone”作为TN,我得到一个错误:操作数数据类型varchar对于减号运算符无效。如果我将TypeCode和TypeValue签出,则查询运行正常,有什么想法吗?@user您有几个输入错误。一太多,太多。用你的版本更新了答案。谢谢,我找到了;。问题就在这里。现在一切都好了,谢谢你的帮助help@user真为你高兴。看看这个关于接受答案是如何工作的。
    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    
;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)