对于 XML 显式:创建多个结果行

FOR XML EXPLICIT: Create multiple result rows

提问人:JonasK 提问时间:2/17/2022 更新时间:2/17/2022 访问量:187

问:

我想在一个语句中创建多个 XML 文件/结果行。

我有什么:

with invoices as (
    select '1' HID, 'Test1' HData, '1' PID, 'Pos1' PData union
    select '1' HID, 'Test1' HData, '2' PID, 'Pos2' PData union
    select '1' HID, 'Test1' HData, '3' PID, 'Pos3' PData union
    select '2' HID, 'Test2' HData, '4' PID, 'Pos1' PData union
    select '2' HID, 'Test2' HData, '5' PID, 'Pos2' PData union
    select '2' HID, 'Test2' HData, '6' PID, 'Pos3' PData
)
select
    case when GROUPING_ID(PID) = 0 then 4
        when GROUPING_ID(HData) = 0 then 3
        when GROUPING_ID(HID) = 0 then 2
        else 1 end tag,
    case when GROUPING_ID(PID) = 0 then 2
        when GROUPING_ID(HData) = 0 then 2
        when GROUPING_ID(HID) = 0 then 1
        else null end parent,
    null [Root!1],
    HID [Invoice!2!HID],
    HData [Header!3!HData!Element],
    PID [Pos!4!PID],
    PData [Pos!4!PData!Element]
from invoices
group by grouping sets ((), (HID), (HID, HData), (HID, HData, PID, PData))
order by HID, HData, PID
for xml explicit, type;

我得到什么:get

我想要什么:want

这可能吗?如何做到这一点?

xml 显式 的 sql-server

评论

1赞 Dale K 2/17/2022
根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入到问题中。请保留将图像用于图表或演示渲染错误,这些错误无法通过文本准确描述。

答:

1赞 Zhorov 2/17/2022 #1

您只需要为每个不同的 :XMLHID

;WITH invoices as (
    select '1' HID, 'Test1' HData, '1' PID, 'Pos1' PData union
    select '1' HID, 'Test1' HData, '2' PID, 'Pos2' PData union
    select '1' HID, 'Test1' HData, '3' PID, 'Pos3' PData union
    select '2' HID, 'Test2' HData, '4' PID, 'Pos1' PData union
    select '2' HID, 'Test2' HData, '5' PID, 'Pos2' PData union
    select '2' HID, 'Test2' HData, '6' PID, 'Pos3' PData
)
SELECT 
   XMLColumn = (
      select
         case when GROUPING_ID(PID) = 0 then 4
              when GROUPING_ID(HData) = 0 then 3
              when GROUPING_ID(HID) = 0 then 2
              else 1 
         end tag,
         case when GROUPING_ID(PID) = 0 then 2
              when GROUPING_ID(HData) = 0 then 2
              when GROUPING_ID(HID) = 0 then 1
              else null 
         end parent,
         null [Root!1],
         HID [Invoice!2!HID],
         HData [Header!3!HData!Element],
         PID [Pos!4!PID],
         PData [Pos!4!PData!Element]
      from invoices
      WHERE i.HID = HID
      group by grouping sets ((), (HID), (HID, HData), (HID, HData, PID, PData))
      order by HID, HData, PID
      for xml explicit, type
   )
FROM invoices i
GROUP BY HID