使用for xml子句可将sql Server查询结果转为XML,常用方式包括RAW、auto和EXPLICIT模式,并可通过ROOT、ELEMENTS等选项控制结构与格式。

在SQL Server中,将查询结果输出为XML格式非常实用,尤其在数据交换、接口对接或生成配置文件等场景。通过T-SQL的FOR XML子句,可以轻松将结果集转换为结构化的XML数据。以下是几种常用方式及实际示例。
使用 FOR XML RAW
RAW模式将每一行结果转换为一个XML元素,列值作为属性或子元素。
- 每行对应一个 <row> 元素(可自定义标签名)
- 默认列值作为属性输出,加 ELEMENTS 可改为子元素
示例:
输出:
<row CustomerID="1" CompanyName="Alfreds Futterkiste" City="Berlin" /> <row CustomerID="2" CompanyName="Ana Trujillo Emparedados" City="México D.F." /> <row CustomerID="3" CompanyName="Antonio Moreno Taquería" City="México D.F." />
使用 FOR XML AUTO
AUTO模式根据SELECT语句中的表顺序自动推断嵌套结构,适合多表连接查询。
- 按表名生成层级元素
- 结构较简洁,但控制性不如EXPLICIT
示例:
SELECT c.CustomerID, o.OrderID, o.OrderDate FROM Customers c JOIN Orders o ON c.CustomerID = o.CustomerID WHERE c.CustomerID = 'ALFKI' FOR XML AUTO, ELEMENTS;
输出:
<c> <CustomerID>ALFKI</CustomerID> <o> <OrderID>10643</OrderID> <OrderDate>2022-08-25T00:00:00</OrderDate> </o> <o> <OrderID>10692</OrderID> <OrderDate>2022-10-03T00:00:00</OrderDate> </o> </c>
使用 FOR XML EXPLICIT
EXPLICIT模式提供完全控制XML结构的能力,适用于复杂层级需求。
- 需手动构造 Tag、Parent 和列的映射关系
- 语法复杂,一般用于特定格式要求
由于其复杂性,通常建议在必须精确控制层级和命名时才使用。
添加根节点与格式化
无论使用哪种模式,都可以通过选项增强输出效果。
完整示例:
SELECT CustomerID, CompanyName, City FROM Customers WHERE Country = 'Germany' FOR XML RAW('Customer'), ROOT('Customers'), ELEMENTS;
输出:
<Customers> <Customer> <CustomerID>1</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <City>Berlin</City> </Customer> ... </Customers>
基本上就这些。掌握FOR XML RAW、AUTO和ROOT等选项,就能满足大多数将SQL查询结果转为XML的需求。不复杂但容易忽略细节,比如ELEMENTS和ROOT的搭配使用。


