共用方式為


使用 FOR XML 的 AUTO 模式

如同 FOR XML (SQL Server) 中所述,AUTO 模式會將查詢結果當作巢狀 XML 元素傳回。 這不會對從查詢結果產生的 XML 圖形提供太多控制權。 如果您想要產生簡單的階層,AUTO 模式查詢會很有用。 不過, 搭配 FOR XML 使用 EXPLICIT 模式搭配 FOR XML 使用 PATH 模式 提供更多控制權和彈性來從查詢結果決定 XML 的形狀。

FROM 子句中的每個資料表都至少有一資料行是列在 SELECT 子句中,這些資料表是以 XML 元素表示。 若在 FOR XML 子句中指定選用性的 ELEMENTS 選項,SELECT 子句中所列的資料行就會對應至屬性或子元素。

所產生的 XML 檔案中的階層結構(即巢狀元素)是依據 SELECT 子句中指定的資料行來確定資料表的順序。 因此,在 SELECT 子句中指定的資料行名稱順序是很重要的。 所識別的左邊第一個資料表,會形成所產生之 XML 文件的最上層元素。 由 SELECT 陳述式之資料行所識別的左邊第二個資料表,則形成最上層元素中的子元素,以此類推。

如果 SELECT 子句中列出的資料行名稱是來自 SELECT 子句先前指定之資料行所識別的資料表,這時會加入該資料行,做為已建立之元素的屬性,而不是開啟新的階層架構層級。 如果指定了 ELEMENTS 選項,資料行將會被加入作為屬性。

例如,執行以下的查詢:

SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerType  
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
WHERE Cust.CustomerID = OrderHeader.CustomerID  
ORDER BY Cust.CustomerID  
FOR XML AUTO  

以下是部份結果:

<Cust CustomerID="1" CustomerType="S">  
  <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />  
</Cust>  
...  

請注意 SELECT 子句中的下列各項:

  • CustomerID 會參考 Cust 資料表。 因此, <Cust> 會建立元素,並將 CustomerID 新增為其屬性。

  • 接著,OrderHeader.CustomerID、OrderHeader.SaleOrderID 及 OrderHeader.Status 這三個資料行會參考 OrderHeader 資料表。 因此,<OrderHeader> 元素被新增為 <Cust> 元素的子元素,並將三個欄位新增為 <OrderHeader> 的屬性。

  • 接下來,Cust.CustomerType 資料行又會參考已由 Cust.CustomerID 資料行所識別的 Cust 資料表。 因此並未建立任何新元素。 相反地,CustomerType 屬性會新增至先前建立的 <Cust> 元素。

  • 查詢會為資料表名稱指定別名。 這些別名會以對應的元素名稱來顯示。

  • 若要將所有子系集合在一個父系之下,ORDER BY 是必要的。

此查詢和上一個查詢類似,不同的是 SELECT 子句會將 OrderHeader 資料表中的資料行,指定在 Cust 資料表中的資料行之前。 因此,會建立第一個專案 <OrderHeader> ,然後將 <Cust> 子專案加入其中。

select OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerID,   
       Cust.CustomerType  
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
where Cust.CustomerID = OrderHeader.CustomerID  
for xml auto  

以下是部份結果:

<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">  
  <Cust CustomerID="1" CustomerType="S" />  
</OrderHeader>  
...  

若將 ELEMENTS 選項加入 FOR XML 子句,則會傳回元素中心的 XML。

SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerType  
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
WHERE Cust.CustomerID = OrderHeader.CustomerID  
ORDER BY Cust.CustomerID  
FOR XML AUTO, ELEMENTS  

以下是部份結果:

<Cust>  
  <CustomerID>1</CustomerID>  
  <CustomerType>S</CustomerType>  
  <OrderHeader>  
    <CustomerID>1</CustomerID>  
    <SalesOrderID>43860</SalesOrderID>  
    <Status>5</Status>  
  </OrderHeader>  
   ...  
</Cust>  
...  

在此查詢中,建立 <Cust> 元素時,會一一比較資料列中的 CustomerID 值,因為 CustomerID 是資料表的主索引鍵。 如果未將 CustomerID 識別為數據表的主鍵,則會將此查詢中的所有數據行值 (CustomerID, CustomerType) 從一個數據列與下一個數據列進行比較。 若值有所差異,新的 <Cust> 元素會新增至 XML。

在比較這些資料行的值時,如果所要比較的任何資料行中具有 textntextimagexml類型,FOR XML 就會認定該值是不同的 (即使該值可能是相同的),而不加以比較。 這是因為不支持比較大型物件。 針對所選取的每個資料列,都會將元素加入結果中。 請注意,會比較 (n)varchar(max)varbinary(max) 的欄位。

當 SELECT 子句中的欄位無法與 FROM 子句中識別的任何資料表產生關聯時,例如在匯總欄位或計算欄位的情況下,該欄位會在 XML 文件中新增至最深巢狀層級,並在清單中遇到時置於相應位置。 若該資料行是出現在 SELECT 子句中的第一個資料行,則會將該資料行新增至最上層元素。

若在 SELECT 子句中指定星號 (*) 萬用字元,就會根據查詢引擎所傳回的資料列順序,以上述同樣的方式來決定巢狀作業。

本節中

下列主題提供有關 AUTO 模式的詳細資訊:

另請參閱

SELECT (Transact-SQL)
FOR XML (SQL Server)