【问题标题】:T-SQL XML: How do I get my results in the format listed below?T-SQL XML:如何获得下面列出的格式的结果?
【发布时间】:2018-06-13 13:25:17
【问题描述】:

这是我第一次来这里。我需要将我的 XML 格式化为以下格式:

<Summary Year="2018" QtrNum="1" WeekNum="4" Date="1/22/2018" Code="101">

一旦我得到这种格式,我就需要为我的表的每一行生成这个 XML。这是预期结果集的屏幕截图。

Expected Result Set

提前谢谢你。

【问题讨论】:

  • 请添加示例数据....最好是添加 MCVE(DML 和 DDL)

标签: sql sql-server xml tsql


【解决方案1】:

虽然你的问题不太清楚,但我的魔法水晶球告诉我,你可能正在寻找这样的东西:

DECLARE @someTable TABLE(SomeDate DATE, SomeQrt INT, SomeWeek INT, SomeCode INT);
INSERT INTO @someTable VALUES('20180122',1,4,101);

DECLARE @SomeRelatedTable TABLE(SomeText VARCHAR(100),SomeCode INT);
INSERT INTO @SomeRelatedTable VALUES('Row 1',101)
                            ,('Row 2',101)
                            ,('Other code',999);

SELECT YEAR(t.SomeDate) AS [@Year]
      ,t.SomeQrt AS [@QrtNum]
      ,t.SomeWeek AS [@WeekNum]
      ,t.SomeDate AS [@Date]
      ,t.SomeCode AS [@Code]
      ,(
        SELECT SomeText AS [@InnerText]
        FROM @SomeRelatedTable rt
        WHERE rt.SomeCode=t.SomeCode
        FOR XML PATH('InnerNode'),TYPE
       )
FROM @someTable t           
FOR XML PATH('Summary');

结果

<Summary Year="2018" QrtNum="1" WeekNum="4" Date="2018-01-22" Code="101">
  <InnerNode InnerText="Row 1" />
  <InnerNode InnerText="Row 2" />
</Summary>           

一些解释

FOR XML PATH 允许通过列的别名和PATH / ROOT 扩展完全控制 XML 生成。

相关(内部)节点是使用相关子查询创建的。

【讨论】:

  • 您好,非常感谢您的反馈。这对我有帮助,但我仍然缺乏我需要的东西。所以我不需要按位置分组的 XML 的结果,而是按位置分组的 XML 本身。因此,当运行最终查询而不是仅接收一个 XML 结果时。我想收到每个位置的 XML 结果。这有意义吗?
  • @EricHathcock 这有意义吗? 不,不适合我...尝试添加示例数据和预期结果。查看我声明模型场景的方式,复制并粘贴它,根据您的需要进行调整并展示您想要获得的内容。使用问题的编辑选项重新处理您的问题。完成后您可以在此处发表评论以提醒我。
  • 再次,这是我第一次来这里,所以我为我的缺乏经验而道歉。我能够解决我的问题。我现在会更新问答部分。
  • @EricHathcock 欢迎来到 SO,快乐编码
【解决方案2】:

我能够解决我的问题。看看下面的场景。

drop table #test
create table #test(id int identity(1,1),locationcode varchar(6),businessdate date, quarternum int, weeknum int)

insert into #test(locationcode,businessdate, quarternum, weeknum)
values('000001',GETDATE(),2,2),
('000001',GETDATE(),2,2),
('000002',GETDATE(),2,2),
('000003',GETDATE(),2,2),
('000004',GETDATE(),2,2),
('000005',GETDATE(),2,2),
('000006',GETDATE(),2,2),
('000007',GETDATE(),2,2)

SELECT 
    (SELECT YEAR(b.businessdate) AS '@Year',b.QuarterNum AS '@QtrNum',b.WeekNum AS '@WeekNum',FORMAT(b.BusinessDate,'MM/DD/YYYY') AS '@Date'
                ,b.LocationCode  AS '@Code' 
     FROM #test c where b.id = c.id FOR XML PATH('DailySummary'),TYPE) AS Row
FROM #test b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多