📜  SQL 服务器 |将 T-SQL 中的表转换为 XML(1)

📅  最后修改于: 2023-12-03 15:05:19.014000             🧑  作者: Mango

SQL Server | 将 T-SQL 中的表转换为 XML

在 SQL Server 中,我们可以使用 FOR XML 子句将查询结果转换为 XML 格式。同时,我们也可以使用 FOR XML 子句将 T-SQL 中的表转换为 XML 格式。

语法

转换语法如下:

SELECT *
FROM tablename
FOR XML [ RAW | AUTO | EXPLICIT | PATH ] [ , XMLDATA ] [ , ELEMENTS ] [ , BINARY BASE64 ] [ , TYPE ] 

其中,FOR XML 子句有五个参数:

  • RAW:生成基本的 XML 元素和属性。在 RAW 模式下,每一行数据会生成一个 XML 元素。
  • AUTO:自动将关系数据转换为 XML 元素和属性。在 AUTO 模式下,SQL Server 会自动根据查询结果生成 XML 元素和属性,但是生成的 XML 不能嵌套。
  • EXPLICIT:强制用户指定要生成的 XML 元素和属性。在 EXPLICIT 模式下,用户需要使用 XML 架构来定义 XML 节点的层次结构,再使用 FOR XML EXPLICIT 来生成 XML。
  • PATH:生成嵌套的 XML 元素和属性。在 PATH 模式下,可以根据查询结果来生成嵌套的 XML,使用 FOR XML PATH 即可。
  • XMLDATA:使用 XMLDATA 时,返回的 XML 包含架构定义信息。
  • ELEMENTS:当设置了 ELEMENTS 参数时,在生成 XML 时,将把每个列名转换成一个 XML 元素的名称。
  • BINARY BASE64:将二进制数据转换成 BASE64 编码的字符串。
  • TYPE:将 XML 数据类型直接生成为 XML。TYPE 模式下,会返回 xml 类型的结果。
实例

我们使用以下的表来演示如何将 T-SQL 中的表转换为 XML。

CREATE TABLE product (
    id INT IDENTITY PRIMARY KEY,
    name VARCHAR(50),
    price DECIMAL(10,2)
);

INSERT INTO product (name, price)
VALUES ('product1', 99.9), ('product2', 199.9), ('product3', 299.9);
将表转换为基本的 XML
SELECT *
FROM product
FOR XML RAW

结果如下:

<product id="1" name="product1" price="99.90" /><product id="2" name="product2" price="199.90" /><product id="3" name="product3" price="299.90" />
将表转换为自动转换的 XML
SELECT *
FROM product
FOR XML AUTO

结果如下:

<product id="1" name="product1" price="99.90" /><product id="2" name="product2" price="199.90" /><product id="3" name="product3" price="299.90" />
将表转换为嵌套的 XML
SELECT *
FROM product
FOR XML PATH, ROOT('products')

结果如下:

<products><product><id>1</id><name>product1</name><price>99.90</price></product><product><id>2</id><name>product2</name><price>199.90</price></product><product><id>3</id><name>product3</name><price>299.90</price></product></products>
将表转换为指定的 XML
SELECT 
    id AS 'product/id',
    name AS 'product/name',
    price AS 'product/price'
FROM product
FOR XML PATH(''), ROOT('products')

结果如下:

<products><product><id>1</id><name>product1</name><price>99.90</price></product><product><id>2</id><name>product2</name><price>199.90</price></product><product><id>3</id><name>product3</name><price>299.90</price></product></products>
将 XML 转换为表

我们可以使用 OPENXML 函数将 XML 转换为表。

DECLARE @xml XML = '<products><product><id>1</id><name>product1</name><price>99.90</price></product><product><id>2</id><name>product2</name><price>199.90</price></product><product><id>3</id><name>product3</name><price>299.90</price></product></products>';

DECLARE @doc INT;
EXEC sp_xml_preparedocument @doc OUTPUT, @xml;

SELECT *
FROM OPENXML(@doc, '/products/product', 2) WITH (id INT '@id', name VARCHAR(50) 'name', price DECIMAL(10,2) 'price')

EXEC sp_xml_removedocument @doc;

结果如下:

id	name	price
------------
1	product1	99.90
2	product2	199.90
3	product3	299.90
总结

使用 FOR XML 子句可以将 T-SQL 中的表转换成 XML 格式,同时还可以通过指定方法和参数来控制生成的 XML 格式。此外,我们还可以使用 OPENXML 函数将 XML 转换成表,因此,在处理 Web 应用程序等需要 XML 格式的数据时,FOR XMLOPENXML 函数是非常有用的。