我编写了一个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吗?非常感谢。
答案 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月的第二个日期。让引擎为你做翻译......