📅  最后修改于: 2023-12-03 15:05:19.014000             🧑  作者: Mango
在 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);
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" />
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" />
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>
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>
我们可以使用 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 XML
和 OPENXML
函数是非常有用的。