使用 xml 原始元素和 xml 路径时查询结果相同

Query results same when using xml raw,element and xml path

我正在使用 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编译于.

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 模式指定 "special" 列名称,并为 [=16= 使用了 ELEMENTS 选项]模式。

有关 PATH and RAW 模式的参考,请参阅 MSDN。