【问题标题】:Flatten XML Structure (SQL Server)展平 XML 结构 (SQL Server)
【发布时间】:2015-04-21 20:20:31
【问题描述】:

我有以下通过 Web 服务传递给存储过程的 XML

    <Company>
       <Records>
         <Person>
           <ServicePostalCodes>
             <PostalCode>80017</PostalCode>
             <PostalCode>80018</PostalCode>
             <PostalCode>80019</PostalCode>
             <PostalCode>80020</PostalCode>
             <PostalCode>80021</PostalCode>
             <PostalCode>80022</PostalCode>
           </ServicePostalCodes>
          <Employee>
             <EmployeeId>123456-789</EmployeeId>
             <Street1>http</Street1>
             <City>www</City>
             <State>StackOverflow</State>
             <Zip>DotCom</Zip>
          </Employee>
        </Person>
        <Person>
         <ServicePostalCodes>
            <PostalCode>90031</PostalCode>
            <PostalCode>90032</PostalCode>
            <PostalCode>90033</PostalCode>
            <PostalCode>90034</PostalCode>
            <PostalCode>90035</PostalCode>
            <PostalCode>90036</PostalCode>
         </ServicePostalCodes>
         <Employee>
            <EmployeeId>222222-789</EmployeeId>
            <Street1>http</Street1>
            <City>www</City>
            <State>StackOverflow</State>
            <Zip>DotCom</Zip>
         </Employee>
       </Person>
    </Records>
   </Company>

我正在寻找一种将其“扁平化”为 SQL 结果集的方法,如下所示:

    Person     |  ServicePostalCode
    123456-789 |  80017
    123456-789 |  80018
    123456-789 |  80019
    222222-789 |  90031
    222222-789 |  90032
    222222-789 |  90033

提前感谢您的帮助

【问题讨论】:

    标签: sql-server-2008 sql-server-2012 xquery


    【解决方案1】:

    我相信:

    SELECT
          People.col.value('Employee[1]/EmployeeId[1]','nvarchar(100)') AS Person,
          PostalCodes.col.value('(text())[1]','nvarchar(100)')
    FROM  
          @xml.nodes('/Company/Records/Person') AS People(col) CROSS APPLY
          col.nodes('ServicePostalCodes/PostalCode') AS PostalCodes(col)
    

    假设您的 XML 在 @xml 中,将执行您想要的操作

    这基本上是从每个 /Company/Records/Person 记录中创建一个表,然后对相应 ServicePostalCodes 中的每个记录执行 CROSS APPLY(类似于 JOIN,但逐行执行) /PostalCode 记录(例如是孩子)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2012-03-02
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多