首页 > 解决方案 > sql server 等效于 xmlelement 格式

问题描述

我编写了一个 Oracle 包来查询 XML 中的一些数据,如下所示:

select 
  XMLSERIALIZE(DOCUMENT 
  xmlelement("QueryResults", XMLAttributes('Demographics And Relationships' as "title"),
  xmlelement("Row",
    xmlelement("field",XMLAttributes( 'Title' as "title"),pn.title),
    xmlelement("field",XMLAttributes( 'First Names' as "title"),pn.first_names),
    xmlelement("field",XMLAttributes( 'Last Name' as "title"), pn.last_name)
  )
  ) as clob indent size = 2
) as XML
from people_names pn

返回:

<QueryResults title="Demographics And Relationships">
<Row>
<field title="Title">MR</field>
<field title="First Names">John</field>
<field title="Last Name">Smith</field>
<field title="Date of Birth">20/07/1990</field>
</Row>
</QueryResults>

我现在正在尝试将同一包的 SQL 服务器版本放在一起,但无法使其与 Oracle 输出相匹配,该输出包括一个 ROW 元素来覆盖返回的每一行,一个字段标记来覆盖行内的每个元素,以及一个要用作属性的列名的别名。

我已经尝试了 FOR XML EXPLICIT/RAW/AUTO 等的各种排列,并且可以获得一些所需的输出,但不是全部。谁能建议我可以使用 T-SQL 进行这项工作的方法?非常感谢。

标签: sqlxmloracletsqlsql-server-2012

解决方案


在 T-SQL 中对这只猫进行剥皮的方法不止一种,但我的偏好是FOR XML PATH

DECLARE @T TABLE(
    title nvarchar(max),
    first_names nvarchar(max),
    last_name nvarchar(max),
    date_of_birth datetime
)
INSERT @t VALUES 
    ('MR', 'John', 'Smith', '1990-07-20'), 
    ('MS', 'Jane', 'Doe', '1991-12-03')

SELECT [@title] = 'Demographics and Relationships', (
    SELECT
        (SELECT [@title] = 'Title', [data()] = title FOR XML PATH('field'), TYPE),
        (SELECT [@title] = 'First Names', [data()] = first_names FOR XML PATH('field'), TYPE),
        (SELECT [@title] = 'Last Name', [data()] = last_name FOR XML PATH('field'), TYPE),
        (SELECT [@title] = 'Date of Birth', [data()] = FORMAT(date_of_birth, 'dd/MM/yyyy') FOR XML PATH('field'), TYPE)
    FROM @T
    FOR XML PATH('Row'), TYPE
)
FOR XML PATH('QueryResults')

结果:

<QueryResults title="Demographics and Relationships">
  <Row>
    <field title="Title">MR</field>
    <field title="First Names">John</field>
    <field title="Last Name">Smith</field>
    <field title="Date of Birth">20/07/1990</field>
  </Row>
  <Row>
    <field title="Title">MS</field>
    <field title="First Names">Jane</field>
    <field title="Last Name">Doe</field>
    <field title="Date of Birth">03/12/1991</field>
  </Row>
</QueryResults>

推荐阅读