使用xml raw,element和xml路径时查询结果相同

时间:2015-03-25 15:17:23

标签: sql-server sqlxml

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

1 个答案:

答案 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>

有关PATHRAW模式的参考信息,请参阅MSDN。