65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (11投票s)

2017年5月29日

CPOL

3分钟阅读

viewsIcon

17665

简要介绍如何在 MS SQL Server 中使用 RAW 模式的 FOR XML 子句将数据以 XML 格式返回。

引言

不久前,我被分配了一项任务,使用存储过程从数据库生成 XML 文件,并获得了作为参考的存储过程。参考存储过程将数据提取到游标中,然后处理每个记录,通过追加 string 字面量来创建 XML 元素,然后返回生成的 string "XML"。在查看了该存储过程后,我对自己说,一定有更好的方法来完成这项任务,事实证明确实有。使用 FOR XML 子句,可以将表记录作为 XML 数据返回。在了解了这一点后,我决定写一篇文章来介绍它。

文章系列路线图

这是 4 部分系列文章中的第 1 篇。其他文章如下所示

目录

背景

需要对 SQL 连接有基本的了解才能继续学习。

Using the Code

下面的文章将使用以下数据库。您可以复制/粘贴以下代码以继续学习,或者创建自己的数据库并调整查询。

创建数据库,如下所示

CREATE DATABASE FOR_XML_TUTORIAL;

执行以下语句以创建 CUSTOMERORDER 表,并用数据填充它们。

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

查询返回。

query data

要在 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 模式。

© . All rights reserved.