sql - 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 进行这项工作的方法?非常感谢。
解决方案
在 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>
推荐阅读
- html - 在为这些社交媒体服务使用自定义协议时,不同社交媒体共享链接的 URL 应该是什么样的?
- html - IE11 / Edge 中的剑道窗口大小问题
- reactjs - React/Enzyme 测试 - 在模拟事件(异步或同步?)之后检索状态
- ssl - 通配符证书中是否允许使用特殊字符
- node.js - 如何在另一个 promise .then 链中使用 Promise.all()
- sql - 查询以识别两个大表之间的父/子关系
- python - 使用 SQL Druid Query 过滤模式
- reactjs - 两个突变和一个查询:我的导出是什么样的?
- elasticsearch - 对渗透查询及其文档使用单独的索引有多重要?
- typescript - 如何根据回调的返回类型指定返回类型?