İç içe geçmiş otomatik modu sorgusu kullanarak eşi oluşturuluyor
Aşağıdaki örnek, iç içe geçmiş bir otomatik modu sorgusu kullanarak eşi üretmek nasıl gösterir.Bu tür xml oluşturmak için yalnızca diğer açık modunu kullanmak için yoludur.Ancak, bu hantal olabilir.
Örnek
Bu sorgu, satış siparişi bilgileri sağlayan xml oluşturur.Bu özellikler şunlardır:
Sales order header information, SalesOrderID, SalesPersonID, and OrderDate.AdventureWorks2008R2 stores this information in the SalesOrderHeader table.
Satış sipariş ayrıntı bilgileri.Bu bir içerir veya birim fiyat, daha fazla ürün, sipariş ve sipariş edilen miktar.Bu bilgiler depolanır SalesOrderDetail tablo.
Satış Temsilcisi bilgileri.Siparişi alan satış temsilcisinin budur.
İzleyen iki ayrı sorgu şeklinde küçük bir fark ile xml oluşturur.
xml içinde ilk sorgunun oluşturduğu <SalesOrderHeader> görünür bir kardeş childof <SalesOrder>:
USE AdventureWorks2008R2;
GO
SELECT
(SELECT TOP 2 SalesOrderID, SalesPersonID, CustomerID,
(SELECT TOP 3 SalesOrderID, ProductID, OrderQty, UnitPrice
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetail.SalesOrderID =
SalesOrderHeader.SalesOrderID
FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderHeader.SalesOrderID = SalesOrder.SalesOrderID
FOR XML AUTO, TYPE)
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID
FROM Sales.SalesOrderHeader, Sales.SalesPerson
WHERE SalesOrderHeader.SalesPersonID = SalesPerson.BusinessEntityID
) AS SalesOrder
ORDER BY SalesOrder.SalesOrderID
FOR XML AUTO, TYPE;
Önceki sorguda dış deyim aşağıdakileri yapar:
Satır kümesi sorguları SalesOrder, belirtilen, from yan tümce tümce tümce.Sonuç xml ile bir veya daha fazla olur <SalesOrder> öğeleri.
Specifies AUTO mode and the TYPE directive.AUTO mode transforms the query result into XML, and the TYPE directive returns the result as xml type.
Virgülle ayrılmış iki iç içe select deyimleri içerir.Satış siparişi bilgileri, üstbilgi ve ayrıntıları iç içe ilk seçme alır ve ikinci iç içe deyim satış temsilcisi bilgilerini alır.
- deyim alır SalesOrderID, SalesPersonID, ve CustomerID kendisini içeren başka bir iç içe geçmiş seçin...xml için deyim (ile AUTO mod ve TYPE yönergesi) dönen satış sipariş ayrıntı bilgileri.
Satış Temsilcisi bilgileri alır deyim bir satır kümesi sorguları SalesPerson, created from yan tümce tümce tümce.İçin Fveya xml sorguları çözmek için üretilen from yan tümce tümce tümce. anonim satır kümesi için bir ad girmeniz gerekiyorBu durum, sağlanan adı SalesPerson.
Bu kısmi bir sonucudur:
<SalesOrder>
<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="29825">
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />
</Sales.SalesOrderHeader>
</SalesOrder>
<SalesOrder>
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="29672">
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />
</Sales.SalesOrderHeader>
</SalesOrder>
...
Aşağıdaki sorgu, sonuç XML dışında aynı satış siparişi bilgileri oluşturur <SalesPerson> eşdeğeri olarak görünür <SalesOrderDetail>:
<SalesOrder>
<SalesOrderHeader ...>
<SalesOrderDetail .../>
<SalesOrderDetail .../>
...
<SalesPerson .../>
</SalesOrderHeader>
</SalesOrder>
<SalesOrder>
...
</SalesOrder>
Bu sorgu şöyledir:
USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, SalesPersonID, CustomerID,
(SELECT TOP 3 SalesOrderID, ProductID, OrderQty, UnitPrice
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 OR SalesOrderID=43660
FOR XML AUTO, TYPE;
Bu sonucu verir:
<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="29825">
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />
</Sales.SalesOrderHeader>
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="29672">
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />
</Sales.SalesOrderHeader>
Çünkü TYPE yönergesi döndürür sorgu sonucu olarak xml türü, sorgulama sonuç xml kullanarak çeşitli xml veri türü yöntemleri.Daha fazla bilgi için bkz: xml veri türü yöntemlerini.Aşağıdaki sorgu aşağıdakilere dikkat edin:
Önceki sorgu eklenir FROM yan tümce tümce tümce.Sorgu sonucu tablo olarak döndürülür.Not XmlCol eklenen diğer ad.
The SELECT clause specifies an XQuery against the XmlCol returned in the FROM clause.The query() method of the xml data type is used in specifying the XQuery.Daha fazla bilgi için bkz: Query() yöntemi (xml veri türü).
SELECT XmlCol.query('<Root> { /* } </Root>') FROM ( SELECT SalesOrderID, SalesPersonID, CustomerID, (SELECT TOP 3 SalesOrderID, ProductID, OrderQty, UnitPrice FROM Sales.SalesOrderDetail WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID FOR XML AUTO, TYPE) FROM Sales.SalesOrderHeader WHERE SalesOrderID='43659' or SalesOrderID='43660' FOR XML AUTO, TYPE ) as T(XmlCol);