You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server FOR XML:生成带多子节点及属性的XML解决方案

从SQL Server生成指定结构XML的解决方案

需求:从SQL Server的TabKmenZbozi表生成指定结构的XML输出,要求包含带Deleted属性的group、goodsCard节点及对应子节点,同时为data节点添加type、destination、version属性。已编写SQL实现goodsCard节点的生成,但不清楚如何添加group节点以及为data节点设置属性,最终结合参考方案完成了需求。

表结构

CREATE TABLE [dbo].[TabKmenZbozi](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Nazev1] [nvarchar](50) NULL,
    [GroupGoodsID] [int] NULL,
    [GroupGoodsName] [nvarchar](50) NULL
) ON [PRIMARY]

测试数据

INSERT INTO TabKmenZbozi (Nazev1, GroupGoodsID, GroupGoodsName) 
VALUES
    ('2117 OF SWEDEN 7709901', 1, 'Meals'),
    ('BLIZZARD DOUBLE', 2, 'Drinks'),
    ('Test Test 1111', 1, 'Meals')

期望XML输出

<data type="TEST" destination="FILE" version="1">
  <content>
    <group Deleted="0">
        <GroupGoods ids="1" name="Meals"/>
        <GroupGoods ids="2" name="Drinks"/>
    </group>
      <goodsCard Deleted="2">
        <item ids="2217" idsGroup="2" plu="43"/>
        <item ids="2218" idsGroup="1" plu="43"/>
        <item ids="2219" idsGroup="1" plu="43"/>
        <item ids="2220" idsGroup="1" plu="43"/>
      </goodsCard>
  </content>
</data>

尝试的SQL语句

该语句可正确生成goodsCard节点,但缺少group节点及data节点属性。

SELECT 
  (SELECT 
    (SELECT 
       (SELECT TOP 10  
                 G.ID AS '@ids',
                 G.Nazev1 AS '@name'
        FROM TabKmenZbozi G
      FOR XML PATH('item'), TYPE)
    FOR XML PATH('goodsCard'), TYPE)
  FOR XML PATH ('content'), TYPE)
FOR XML PATH ('data'), TYPE;

最终解决方案SQL

SELECT 
  'TEST' AS '@type',
  'FILE' AS '@destination',
  '1' AS '@version',
   (
    SELECT
      (
       SELECT
         '0' AS '@DELETED',
         (
         SELECT
           TKZ.ID AS 'GroupGoods/@ids',
           TKZ.Nazev1 AS 'GroupGoods/@nazev'
         FROM
           dbo.TabKmenZbozi AS TKZ
         FOR XML PATH(''), TYPE
         )
       FOR XML PATH('group'), TYPE
      ),
      (
       SELECT
         '2' AS '@DELETED',
         (
         SELECT TOP 10
           TKX.ID AS 'goodsCard/@ids',
           TKX.Nazev1 AS 'goodsCard/@nazev'
         FROM
           dbo.TabKmenZbozi AS TKX
           FOR XML PATH(''), TYPE
         )
       FOR XML PATH('goodsCard'), TYPE
      )
    FOR XML PATH('content'), TYPE
   )
FOR XML PATH('data'), TYPE;

内容的提问来源于stack exchange,提问作者Hadasek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:14:53