Microsoft SQL Server 使用XPath表达式指定结构
示例
SELECT 'XPath example' AS 'head/title', 'This example demonstrates ' AS 'body/p', 'https://www.w3.org/TR/xpath/' AS 'body/p/a/@href', 'XPath expressions' AS 'body/p/a' FOR XML PATH('html')
<html> <head> <title>XPath example</title> </head> <body> <p>This example demonstrates <a href="https://www.w3.org/TR/xpath/">XPath expressions</a></p> </body> </html>
在中FORXMLPATH,没有名称的列成为文本节点。NULL或''因此成为空文本节点。注意:您可以通过使用将已命名的列转换为未命名的列AS*
DECLARE @tempTable TABLE (Ref INT, Des NVARCHAR(100), Qty INT) INSERT INTO @tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2) SELECT ROW_NUMBER() OVER (ORDER BY Ref) AS '@NUM', 'REF' AS 'FLD/@NAME', REF AS 'FLD', '', 'DES' AS 'FLD/@NAME', DES AS 'FLD', '', 'QTY' AS 'FLD/@NAME', QTY AS 'FLD' FROM @tempTable FOR XML PATH('LIN'), ROOT('row')
<row> <LIN NUM="1"> <FLD NAME="REF">100001</FLD> <FLD NAME="DES">Normal</FLD> <FLD NAME="QTY">1</FLD> </LIN> <LIN NUM="2"> <FLD NAME="REF">100002</FLD> <FLD NAME="DES">Foobar</FLD> <FLD NAME="QTY">1</FLD> </LIN> <LIN NUM="3"> <FLD NAME="REF">100003</FLD> <FLD NAME="DES">Hello World</FLD> <FLD NAME="QTY">2</FLD> </LIN> </row>
使用(空)文本节点有助于将先前的输出节点与下一节点分离,以便SQLServer知道为下一列启动一个新元素。否则,当属性已经存在于它认为是“当前”元素上时,就会感到困惑。
例如,在SELECT语句中的元素和属性之间没有空字符串的情况下,SQLServer给出错误:
以属性为中心的列“FLD/@NAME”一定不能出现在FORXMLPATH中XML层次结构中以非属性为中心的同级之后。
还要注意,此示例还将XML封装在名为的根元素中row,该元素由指定ROOT('row')