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

如何使存储过程查询输出指定结构的XML格式?

问题描述

原始查询语句:

SELECT 
    IncidentEventID AS Id, -- Always select first column as the primary key column and use alias as Id 
    CreatedDate,
    IncidentEventName,
    IncidentEventDesc
FROM
    vIncidentEvent
WHERE
    IncidentID = 987148059
    AND AuditTypeID IS NULL;

查询返回结果:

IdCreatedDateIncidentEventNameIncidentEventDesc
1211448/2/2024 11:32:57 AMRequest InitiatedRC_GA_BASELINE NBI initiated by Admin, LBMS
1211458/2/2024 11:38:17 AMTask CompletedEnter Parties and Key Info completed by Admin, LBMS

需要输出的目标XML结构:

<xml>
  <rows>
    <row id="121144">
      <cell>
        <![CDATA[8/2/2024 11:32:57 AM]]>
      </cell>
      <cell>
        <![CDATA[Request Initiated]]>
      </cell>
      <cell>
        <![CDATA[RC_GA_BASELINE NBI initiated by Admin, LBMS]]>
      </cell>
    </row>
    <row id="121145">
      <cell>
        <![CDATA[8/2/2024 11:38:17 AM]]>
      </cell>
      <cell>
        <![CDATA[Task Completed]]>
      </cell>
      <cell>
        <![CDATA[Enter Parties and Key Info completed by Admin, LBMS]]>
      </cell>
    </row>
  </rows>
</xml>

用户尝试的错误查询:

SELECT 
    IncidentEventID AS [@id], -- Alias the primary key as an XML attribute
    CreatedDate AS 'cell',
    IncidentEventName AS 'cell',
    IncidentEventDesc AS 'cell'
FROM
    vIncidentEvent
WHERE
    IncidentID = 987148059
    AND AuditTypeID IS NULL
FOR XML PATH('row'), ROOT('rows'), TYPE;

问题:所有字段内容被合并到同一个<cell>标签内,不符合需求。

解决方案

问题根源是直接将多个字段命名为cell,SQL Server会自动合并同名元素。要生成独立的<cell>标签,需为每个字段创建单独的嵌套结构,同时手动拼接CDATA以匹配目标格式,最后包裹外层<xml>节点。

正确的查询语句如下:

SELECT (
    SELECT 
        IncidentEventID AS [@id],
        -- 为每个字段生成独立cell标签并包裹CDATA
        (SELECT '<![CDATA[' + CONVERT(VARCHAR(50), CreatedDate, 101) + ' ' + CONVERT(VARCHAR(10), CreatedDate, 108) + ']]>' AS [*] FOR XML PATH(''), TYPE) AS cell,
        (SELECT '<![CDATA[' + IncidentEventName + ']]>' AS [*] FOR XML PATH(''), TYPE) AS cell,
        (SELECT '<![CDATA[' + IncidentEventDesc + ']]>' AS [*] FOR XML PATH(''), TYPE) AS cell
    FROM vIncidentEvent
    WHERE IncidentID = 987148059 AND AuditTypeID IS NULL
    FOR XML PATH('row'), ROOT('rows'), TYPE
) AS [*]
FOR XML PATH('xml'), TYPE;

关键说明:

  • 独立cell标签:通过子查询(SELECT ... FOR XML PATH(''), TYPE)为每个字段生成独立内容块,再指定别名cell,确保每个字段对应单独的<cell>节点。
  • CDATA包裹:手动拼接<![CDATA[...]]>字符串,避免特殊字符转义;日期字段用CONVERT格式化,保证输出格式与原始结果一致。
  • 外层xml节点:最外层子查询将<rows>结果作为内容,通过FOR XML PATH('xml')生成顶层<xml>节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:32:14