FOR XML 基础 (RAW 模式):1/4






4.94/5 (11投票s)
简要介绍如何在 MS SQL Server 中使用 RAW 模式的 FOR XML 子句将数据以 XML 格式返回。
引言
不久前,我被分配了一项任务,使用存储过程从数据库生成 XML 文件,并获得了作为参考的存储过程。参考存储过程将数据提取到游标中,然后处理每个记录,通过追加 string
字面量来创建 XML 元素,然后返回生成的 string
"XML"。在查看了该存储过程后,我对自己说,一定有更好的方法来完成这项任务,事实证明确实有。使用 FOR XML
子句,可以将表记录作为 XML 数据返回。在了解了这一点后,我决定写一篇文章来介绍它。
文章系列路线图
这是 4 部分系列文章中的第 1 篇。其他文章如下所示
- FOR XML 基础 (RAW 模式):1/4
- FOR XML 基础 (AUTO 模式):2/4
- FOR XML 基础 (EXPLICIT 模式):3/4
- FOR XML 基础 (PATH 模式): 4 篇中的第 4 篇
目录
背景
需要对 SQL 连接有基本的了解才能继续学习。
Using the Code
下面的文章将使用以下数据库。您可以复制/粘贴以下代码以继续学习,或者创建自己的数据库并调整查询。
创建数据库,如下所示
CREATE DATABASE FOR_XML_TUTORIAL;
执行以下语句以创建 CUSTOMER
和 ORDER
表,并用数据填充它们。
USE [FOR_XML_TUTORIAL];
CREATE TABLE [CUSTOMER]
(
CUSTOMER_ID INT PRIMARY KEY NOT NULL,
FIRST_NAME VARCHAR(25) NOT NULL,
LAST_NAME VARCHAR(25) NOT NULL,
POSTAL_CODE VARCHAR(2) NOT NULL,
);
CREATE TABLE [ORDER]
(
ORDER_ID INT PRIMARY KEY NOT NULL,
CUSTOMER_ID INT NOT NULL REFERENCES CUSTOMER(CUSTOMER_ID),
TOTAL_ITEMS INT NOT NULL,
TOTAL_AMOUNT NUMERIC(18,2) NOT NULL
);
INSERT INTO CUSTOMER VALUES (1, 'John', 'Michaels', 'TX');
INSERT INTO CUSTOMER VALUES (2, 'Shawn', 'Cena', 'MA');
INSERT INTO CUSTOMER VALUES (3, 'Dwayne', 'Austin', 'TX');
INSERT INTO CUSTOMER VALUES (4, 'Steve', 'Johnson', 'FL');
INSERT INTO [ORDER] VALUES (1, 1, 5, 32.50);
INSERT INTO [ORDER] VALUES (2, 1, 2, 21.36);
INSERT INTO [ORDER] VALUES (3, 2, 7, 59.00);
INSERT INTO [ORDER] VALUES (4, 3, 2, 18.24);
INSERT INTO [ORDER] VALUES (5, 4, 3, 30.00);
INSERT INTO [ORDER] VALUES (6, 4, 6, 66.00);
FOR XML 模式
在使用 FOR XML
子句时,必须指定一个模式,该模式将相应地返回 XML。以下是可用模式的列表
RAW
AUTO
EXPLICIT
PATH
RAW 模式
我们将使用以下查询来返回 customer
信息以及 order
。
SELECT C.FIRST_NAME,
C.LAST_NAME,
C.POSTAL_CODE,
O.ORDER_ID,
O.TOTAL_ITEMS,
O.TOTAL_AMOUNT
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
查询返回。
要在 RAW 模式下返回 XML 数据,只需在上述查询中追加 FOR XML RAW
即可。
SELECT C.FIRST_NAME,
C.LAST_NAME,
C.POSTAL_CODE,
O.ORDER_ID,
O.TOTAL_ITEMS,
O.TOTAL_AMOUNT
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
FOR XML RAW
上述查询返回
正如您所看到的,查询返回的每条记录都被转换为 XML 元素 "row
",而列则被转换为属性,其属性值设置为查询返回的值。
要更改元素名称,请在 RAW
关键字后追加所需的元素名称,如下所示
SELECT C.FIRST_NAME,
C.LAST_NAME,
C.POSTAL_CODE,
O.ORDER_ID,
O.TOTAL_ITEMS,
O.TOTAL_AMOUNT
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
FOR XML RAW('Customer')
上述查询返回
这会将每个元素的名称从 row
更改为 Customer
。
要更改属性的 name
,只需为列提供别名,如下所示
SELECT C.FIRST_NAME AS 'FirstName',
C.LAST_NAME AS 'LastName',
C.POSTAL_CODE AS 'PostalCode',
O.ORDER_ID AS 'OrderId',
O.TOTAL_ITEMS AS 'Items',
O.TOTAL_AMOUNT AS 'Amount'
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
FOR XML RAW('Customer')
上述查询返回带有新属性名称的数据
要将每个元素嵌套在 root
元素内,请追加 ROOT
关键字,如下所示
SELECT C.FIRST_NAME AS 'FirstName',
C.LAST_NAME AS 'LastName',
C.POSTAL_CODE AS 'PostalCode',
O.ORDER_ID AS 'OrderId',
O.TOTAL_ITEMS AS 'Items',
O.TOTAL_AMOUNT AS 'Amount'
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
FOR XML RAW('Customer'), ROOT
现在,返回的数据嵌套在名为 "root
" 的父元素内。
要更改 root
元素的名称,请在 ROOT
关键字后追加所需的名称,如下所示
SELECT C.FIRST_NAME AS 'FirstName',
C.LAST_NAME AS 'LastName',
C.POSTAL_CODE AS 'PostalCode',
O.ORDER_ID AS 'OrderId',
O.TOTAL_ITEMS AS 'Items',
O.TOTAL_AMOUNT AS 'Amount'
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
FOR XML RAW('Customer'), ROOT('Customers')
上述查询返回的数据将 root
元素的名称更改为 "Customers
"。
到目前为止,我们执行的所有查询都以这样的格式返回 XML 数据:每个列都转换为一个属性。要更改此格式并返回 XML,其中每列都映射到它自己的 element
,请追加 ELEMENTS
关键字,如下所示
SELECT C.FIRST_NAME AS 'FirstName',
C.LAST_NAME AS 'LastName',
C.POSTAL_CODE AS 'PostalCode',
O.ORDER_ID AS 'OrderId',
O.TOTAL_ITEMS AS 'Items',
O.TOTAL_AMOUNT AS 'Amount'
FROM [CUSTOMER] C
INNER JOIN [ORDER] O
ON C.CUSTOMER_ID = O.CUSTOMER_ID
FOR XML RAW('Customer'), ROOT('Customers'), ELEMENTS
现在,每条记录的属性都转换为一个元素,其名称设置为其别名,其值设置为查询返回的值。
注意:我减少了行数以使下面的图像更小
总结
这就是 FOR XML
子句中 RAW 模式的全部内容。在下一篇文章中,我们将学习 AUTO 模式。