我正在使用sql-server 2012:
我有这样的查询:
CREATE TABLE #XmlTestTable
(
ID INT PRIMARY KEY IDENTITY(1,1),
FirstName VARCHAR(20),
LastName VARCHAR(20)
)
INSERT INTO #XmlTestTable (FirstName,LastName) VALUES
('John','Doe'),
('Jane','Doe'),
('Brian','Smith'),
('Your','Mom')
SELECT * FROM #XmlTestTable FOR XML RAW, ELEMENTS --1
SELECT * FROM #XmlTestTable FOR XML PATH --2
结果1:
<row>
<ID>1</ID>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</row>
<row>
<ID>2</ID>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</row>
<row>
<ID>3</ID>
<FirstName>Brian</FirstName>
<LastName>Smith</LastName>
</row>
<row>
<ID>4</ID>
<FirstName>Your</FirstName>
<LastName>Mom</LastName>
</row>
结果2:
<row>
<ID>1</ID>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</row>
<row>
<ID>2</ID>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</row>
<row>
<ID>3</ID>
<FirstName>Brian</FirstName>
<LastName>Smith</LastName>
</row>
<row>
<ID>4</ID>
<FirstName>Your</FirstName>
<LastName>Mom</LastName>
</row>
两个查询都给出相同的结果,?
如何找出差异以及何时使用xml路径或xml元素 Sql-server 2012编译在。
答案 0 :(得分:3)
RAW
模式将查询结果集中的每一行转换为具有通用标识符<row>
或可选提供的元素名称的XML元素。
行集中非NULL的每个列值都映射到<row>
元素的属性,但如果您指定了ELEMENTS
选项,则列值将为被映射到子元素,而不是属性。
在PATH
模式下,列名或列别名被视为XPath
表达式。这些表达式指示值如何映射到XML。每个XPath表达式都是一个相对XPath,它提供项类型,例如属性,元素和标量值,以及将相对于行元素生成的节点的名称和层次结构。
所以PATH
模式可以让您在输出方面获得更大的灵活性。
例如
select FirstName as "Name/First", LastName as "Name/Last" from #XmlTestTable FOR XML PATH
会给你xml像
<row>
<Name>
<First>John</First>
<Last>Doe</Last>
</Name>
</row>
// the rest of xml skipped
和此查询
select FirstName as "@FirstName", LastName as "@LastName" from #XmlTestTable FOR XML path
将以下列格式提供xml:
<row FirstName="John" LastName="Doe" />
<row FirstName="Jane" LastName="Doe" />
<row FirstName="Brian" LastName="Smith" />
<row FirstName="Your" LastName="Mom" />
或者您甚至可以在输出中混合属性和元素,例如:
select
FirstName + ' ' + LastName as "Name/@Full",
FirstName as "Name/First",
LastName as "Name/Last"
from #XmlTestTable FOR XML path
会给你
<row>
<Name Full="John Doe">
<First>John</First>
<Last>Doe</Last>
</Name>
</row>
在您的特定情况下,两个查询的输出完全相同,只是因为您没有为PATH
模式指定“特殊”列名,而在ELEMENTS
模式下使用RAW
选项。 / p>