sql server相当于xmlelement格式

时间:2018-06-11 14:06:56

标签: sql xml oracle tsql sql-server-2012

我编写了一个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吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

在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>

答案 1 :(得分:1)

正如Jeroen Mostert已经告诉过你的那样:猫的皮肤有更多的方法: - )

这是我的建议。

SELECT 'Demographics And Relationships' AS [@title]
      ,(
        SELECT 'Title' AS [field/@title]
              ,pn.title AS [field]
              ,''
              ,'First Names' AS [field/@title]
              ,pn.first_names AS [field]
              ,''
              ,'Last Name' AS [field/@title]
              ,pn.last_name AS [field]
              ,''
              ,'Date of Birth' AS [field/@title]
              ,pn.date_of_birth AS [field]
        FROM @t pn
        FOR XML PATH('Row'),TYPE
       )
FOR XML PATH('QueryResults');

您需要外部子选择,因为 top-root-level 中有一个属性。您可以使用ROOT('root')创建根元素,但此处不支持任何属性。这就是我们需要外部FOR XML PATH()

的原因

<field>节点的内部列表可以通过一个技巧来实现:只需在它们之间放置一个空的“列”。这将告诉引擎关闭元素并开始一个新元素。

关于您的DOB:在XML中,任何日期都应该是ISO8601。在不同的系统上,像03/12/1991这样的日期可以被视为12月的第三个日期或3月的第二个日期。让引擎为你做翻译......