【问题标题】:Using TSQL how can I return XML from a table while grouping by a field?使用 TSQL 如何在按字段分组时从表中返回 XML?
【发布时间】:2017-06-21 19:35:41
【问题描述】:

这很难解释,但我会提供一个例子。假设我有下表:

PolicyNo    ClientNo    Name
--------    --------    ----
  123          1        John         
  123          2        Sally
  ABC          3        Alice
  ABC          4        Bob

我想使用 TSQL 和“FOR XML”将信息分组到类似的 Policy Nos 下,如下所示:

<root>
    <Policy>
        <PolicyNo> 123 </PolicyNo>
        <ClientInfo>
            <ClientNo> 1 </ClientNo>
            <Name> John </Name>
        </ClientInfo>
        <ClientInfo>
            <ClientNo> 2 </ClientNo>
            <Name> Sally </Name>
        </ClientInfo>
    </Policy>
    <Policy>
        <PolicyNo> ABC </PolicyNo>
        <ClientInfo>
            <ClientNo> 3 </ClientNo>
            <Name> Alice </Name>
        </ClientInfo>
        <ClientInfo>
            <ClientNo> 4 </ClientNo>
            <Name> Bob </Name>
        </ClientInfo>
    </Policy>
</root>

【问题讨论】:

    标签: xml tsql group-by for-xml-path


    【解决方案1】:

    这只是对您自己的一个很好的解决方案的补充:

    SELECT 
        T1.PolicyNo AS "PolicyNo",
        (SELECT
            T2.ClientNo AS "ClientNo",
            T2.Name AS "Name"
        FROM @T T2
        WHERE T1.PolicyNo=T2.PolicyNo
        FOR XML PATH ('ClientInfo'),TYPE)
    FROM @T T1
    GROUP BY T1.PolicyNo
    FOR XML PATH ('Policy'), ROOT ('root')
    

    无需使用CAST(... AS XML)。只需使用,TYPE 强制将子选择作为本机XML处理。

    目前我不知道这是否会影响性能(读取为字符串并重新转换为 XML)或者引擎是否足够聪明,实际上不需要这种转换...

    【讨论】:

      【解决方案2】:

      在玩了一会儿之后,我实际上找到了自己问题的答案。这是我的解决方案:

      declare @T table
      (
        PolicyNo varchar(3),
        ClientNo int,
        Name varchar(10)
      )
      
      insert into @T values
      ('123', 1, 'John'),
      ('123', 2, 'Sally'),
      ('ABC', 3, 'Alice'),
      ('ABC', 4, 'Bob')
      
      SELECT 
          T1.PolicyNo AS "PolicyNo",
          cast((SELECT
              T2.ClientNo AS "ClientNo",
              T2.Name AS "Name"
          FROM @T T2
          WHERE T1.PolicyNo=T2.PolicyNo
          FOR XML PATH ('ClientInfo')) as XML)
      FROM @T T1
      GROUP BY T1.PolicyNo
      FOR XML PATH ('Policy'), ROOT ('root')
      

      【讨论】:

        猜你喜欢
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多