下列範例說明 AUTO 模式的使用方式。 這些查詢中有許多是針對 AdventureWorks2012 範例資料庫中 ProductModel 數據表的指令數據行中儲存的自行車製造指令 XML 檔所指定。
範例:擷取客戶、訂單和訂單詳細資訊
此查詢會擷取特定客戶的客戶、訂單和訂單詳細資訊。
USE AdventureWorks2012;
GO
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
Detail.SalesOrderID, Detail.LineTotal, Detail.ProductID,
Product.Name,
Detail.OrderQty
FROM Sales.Customer AS Cust
INNER JOIN Sales.SalesOrderHeader AS OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
INNER JOIN Sales.SalesOrderDetail AS Detail
ON OrderHeader.SalesOrderID = Detail.SalesOrderID
INNER JOIN Production.Product AS Product
ON Product.ProductID = Detail.ProductID
WHERE Cust.CustomerID IN (29672, 29734)
ORDER BY OrderHeader.CustomerID,
OrderHeader.SalesOrderID
FOR XML AUTO;
因為查詢會識別Cust、OrderHeader、Detail和Product這些表格別名,因此模式會生成相應的AUTO元素。 同樣地,子句中指定的 SELECT 數據行識別數據表的順序會決定這些項目的階層。
以下是部份結果。
<Cust CustomerID="29672">
<OrderHeader CustomerID="29672" SalesOrderID="43660">
<Detail SalesOrderID="43660" LineTotal="874.794000" ProductID="758" OrderQty="1">
<Product Name="Road-450 Red, 52" />
</Detail>
<Detail SalesOrderID="43660" LineTotal="419.458900" ProductID="762" OrderQty="1">
<Product Name="Road-650 Red, 44" />
</Detail>
</OrderHeader>
<OrderHeader CustomerID="29672" SalesOrderID="47660">
<Detail SalesOrderID="47660" LineTotal="469.794000" ProductID="765" OrderQty="1">
<Product Name="Road-650 Black, 58" />
</Detail>
</OrderHeader>
<OrderHeader CustomerID="29672" SalesOrderID="49857">
<Detail SalesOrderID="49857" LineTotal="44.994000" ProductID="852" OrderQty="1">
<Product Name="Women's Tights, S" />
</Detail>
</OrderHeader>
...
</Cust>
範例:指定 GROUP BY 和聚合函數
下列查詢會傳回個別客戶標識碼,以及客戶所要求的訂單數目。
USE AdventureWorks2012;
GO
SELECT C.CustomerID, COUNT(*) AS NoOfOrders
FROM Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
On C.CustomerID = SOH.CustomerID
GROUP BY C.CustomerID
FOR XML AUTO;This is the partial result:
<I CustomerID="11000" NoOfOrders="3" />
<I CustomerID="11001" NoOfOrders="3" />
...
範例:在 AUTO 模式中指定計算數據行
此查詢會傳回串連的個別客戶名稱和訂單資訊。 由於計算數據行會指派給在該時間點遇到的最內部層級,因此在此範例中的<SOH>元素。 串連的客戶名稱會新增為結果中元素的屬性 <SOH> 。
USE AdventureWorks2012;
GO
SELECT P.FirstName + ' ' + P.LastName AS Name,
SOH.SalesOrderID
FROM Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
ON C.CustomerID = SOH.CustomerID
INNER JOIN Person.Person AS P
ON P.BusinessEntityID = C.PersonID
FOR XML AUTO;
以下是部份結果:
<SOH Name="Jon Yang" SalesOrderID="43793" />
<SOH Name="Eugene Huang" SalesOrderID="43767" />
若要擷取具有 Name 屬性的 <IndividualCustomer> 元素,並且這些元素包含每個銷售訂單標頭資訊作為子元素,則查詢會使用子選取來重寫。 內部選取會建立一個臨時的IndividualCustomer表,其內包含計算的數據行,該行記錄了個別客戶的名字。 然後,這個數據表會聯結至 SalesOrderHeader 數據表以取得結果。
請注意, Sales.Customer 數據表會儲存個別的客戶資訊,包括 PersonID 該客戶的值。 接著,這會 PersonID 用來從 Person.Person 數據表中尋找聯繫人名稱。
SELECT IndividualCustomer.Name, SOH.SalesOrderID
FROM (SELECT FirstName+ ' '+LastName AS Name, C.PersonID, C.CustomerID
FROM Sales.Customer AS C, Person.Person AS P
WHERE C.PersonID = P.BusinessEntityID) AS IndividualCustomer
LEFT OUTER JOIN Sales.SalesOrderHeader AS SOH
ON IndividualCustomer.CustomerID = SOH.CustomerID
ORDER BY IndividualCustomer.CustomerID, SOH.CustomerIDFOR XML AUTO;
以下是部份結果:
<IndividualCustomer Name="Jon Yang">
<SOH SalesOrderID="43793" />
<SOH SalesOrderID="51522" />
<SOH SalesOrderID="57418" />
</IndividualCustomer>
...
...
範例:傳回二進位數據
此查詢會從 ProductPhoto 數據表傳回產品相片。
ThumbNailPhoto是ProductPhoto表格中的varbinary(max)列。 根據預設, AUTO 模式會傳回二進位數據的參考,該參考是執行查詢之資料庫虛擬根目錄的相對URL。
ProductPhotoID必須指定索引鍵屬性,才能識別影像。 在擷取影像參考時,如此範例所示,必須在SELECT子句中指定資料表的主鍵,以便唯一識別資料列。
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO;
以下是結果:
-- result
<Production.ProductPhoto
ProductPhotoID="70"
ThumbNailPhoto= "dbobject/Production.ProductPhoto[@ProductPhotoID='70']/@ThumbNailPhoto" />
相同的查詢是使用選項BINARY BASE64執行的。 此查詢會傳回base64編碼格式的二進位數據。
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO, BINARY BASE64;
以下是結果:
-- result
<Production.ProductPhoto ProductPhotoID="70" ThumbNailPhoto="Base64 encoded photo" />
根據預設,當您使用 AUTO 模式擷取二進位數據時,會傳回執行查詢之資料庫虛擬根目錄的相對 URL 參考,而不是二進位數據。 如果未指定 BINARY BASE64 選項,就會發生這種情況。
當 AUTO 模式以不區分大小寫的資料庫傳回二進位數據的 URL 參考時,查詢中指定的數據表或數據行名稱與資料庫中的數據表或數據行名稱不符時,查詢就會執行。 不過,參考中傳回的情況可能不一致。 例如:
SELECT ProductPhotoID, ThumbnailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO;
以下是結果:
<Production.PRODUCTPHOTO
PRODUCTPHOTOID="70"
THUMBNAILPHOTO= "dbobject/Production.PRODUCTPHOTO[@ProductPhotoID='70']/@ThumbNailPhoto" />
當 dbobject 查詢針對區分大小寫的資料庫執行時,這可能會是個問題。 若要避免這種情況,查詢中指定的資料表或欄位名稱的大小寫應該與資料庫中資料表或欄位名稱的大小寫一致。
範例:瞭解編碼方式
此範例顯示結果中發生的各種編碼方式。
建立此資料表:
CREATE TABLE [Special Chars] (Col1 char(1) primary key, [Col#&2] varbinary(50));
將下列資料新增至資料表:
INSERT INTO [Special Chars] VALUES ('&', 0x20), ('#', 0x20);
此查詢會從數據表傳回數據。 指定 FOR XML AUTO 模式。 二進位數據會當做參考傳回。
SELECT * FROM [Special Chars] FOR XML AUTO;
以下是結果:
<Special_x0020_Chars
Col1="#"
Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='#']/@Col_x0023__x0026_2"
/>
<Special_x0020_Chars
Col1="&"
Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='&']/@Col_x0023__x0026_2"
/>
這是在結果中編碼特殊字元的程式:
在查詢結果中,傳回之元素和屬性名稱中的特殊 XML 和 URL 字元會使用對應 Unicode 字元的十六進位值來編碼。 在上一個結果中,項目名稱<
Special Chars>被返回為<Special_x0020_Chars>。 屬性名稱 <Col#&2> 會以傳 <Col_x0023__x0026_2>回。 XML 和 URL 特殊字元都會進行編碼。如果元素或屬性的值包含五個標準 XML 字元實體中的任何一個('、“”、“ <、 >和 &),這些特殊 XML 字元一律會使用 XML 字元編碼來編碼。 在上一個結果中,屬性值><
Col1中的值&會編碼為 。&不過,#字符会维持 #,因為它是有效的 XML 字元,而不是特殊的 XML 字元。如果元素或屬性的值包含 URL 中具有特殊意義的任何特殊 URL 字元,它們只會在 DBOBJECT URL 值中編碼,而且只有在特殊字元是數據表或數據行名稱的一部分時才會編碼。 在結果中,屬於資料表名稱
Col#&2一部分的字元#會編碼為_x0023_ in the DBOJBECT URL。