Aracılığıyla paylaş


İç içe otomatik mod sorgusuyla eşdüzeyler oluşturma

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Aşağıdaki örnekte, iç içe AUTO mod sorgusu kullanarak kardeşlerin nasıl üretileceği gösterilmektedir. Böyle bir XML oluşturmanın tek yolu, AÇIK modunu kullanmaktır. Ancak, bu zahmetli olabilir.

Örnek

Bu sorgu, satış siparişi bilgilerini sağlayan XML oluşturur. Buna şunlar dahildir:

  • Satış siparişi başlık bilgileri, SalesOrderID, SalesPersonIDve OrderDate. AdventureWorks2025 bu bilgileri SalesOrderHeader tablosunda depolar.

  • Satış siparişi ayrıntı bilgileri. Buna sipariş edilen bir veya daha fazla ürün, birim fiyat ve sipariş edilen miktar dahildir. Bu bilgiler SalesOrderDetail tablosunda depolanır.

  • Satış kişisi bilgileri. Bu, siparişi alan satış temsilcisidir. SalesPerson tablosu SalesPersonIDsağlar. Bu sorguda, satış sorumlusunun adını bulmak için bu tabloyu Employee tablosuna birleştirmeniz gerekir.

Aşağıdaki iki ayrı SELECT sorgu, şekilde küçük bir farkla XML oluşturur.

İlk sorgu, <SalesPerson> ve <SalesOrderHeader>'in <SalesOrder>'ye kardeş öğe olarak göründüğü XML'i oluşturur.

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),
        (SELECT *
         FROM  (SELECT SalesPersonID, EmployeeID
              FROM Sales.SalesPerson, HumanResources.Employee
              WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As
                     SalesPerson
         WHERE  SalesPerson.SalesPersonID = SalesOrder.SalesPersonID
       FOR XML AUTO, TYPE)
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID
      FROM Sales.SalesOrderHeader, Sales.SalesPerson
      WHERE SalesOrderHeader.SalesPersonID = SalesPerson.SalesPersonID
     ) as SalesOrder
ORDER BY SalesOrder.SalesOrderID
FOR XML AUTO, TYPE;

Önceki sorguda, en dıştaki SELECT deyimi aşağıdakileri yapar:

  • SalesOrdersatır kümesini, FROM yan tümcesinde belirtilen, sorgular. Sonuç, bir veya daha fazla <SalesOrder> öğesine sahip bir XML'dir.

  • AUTO modunu ve TYPE yönergesini belirtir. AUTO modu sorgu sonucunu XML'ye dönüştürür ve TYPE yönergesi sonucu xml türü olarak döndürür.

  • Virgülle ayrılmış iki iç içe SELECT deyimi içerir. İlk iç içe yerleştirilmiş SELECT, satış siparişi bilgilerini, başlık ve ayrıntıları alır ve ikinci iç içe yerleştirilmiş SELECT deyimi, satış temsilcisi bilgilerini alır.

    • SELECT, SalesOrderIDve SalesPersonID alan CustomerID deyimi, satış siparişi ayrıntı bilgilerini döndüren başka bir iç içe SELECT ... FOR XML deyimi (AUTO modu ve TYPE yönergesi ile) içerir.

Satış temsilcisi bilgilerini alan SELECT deyimi, SalesPerson yan tümcesinde oluşturulan FROMsatır kümesini sorgular. FOR XML sorguların çalışması için, FROM yan tümcesinde oluşturulan anonim satır kümesi için bir ad sağlamanız gerekir. Bu durumda, sağlanan ad SalesPersonolur.

Kısmi sonuç şu şekildedir:

<SalesOrder>
  <Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">
    <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>
  <SalesPerson SalesPersonID="279" EmployeeID="279" />
</SalesOrder>
...

Aşağıdaki sorgu, sonuçta elde edilen XML'de <SalesPerson><SalesOrderDetail>eşdüzey olarak görünmesi dışında aynı satış siparişi bilgilerini oluşturur:

<SalesOrder>
    <SalesOrderHeader ...>
          <SalesOrderDetail .../>
          <SalesOrderDetail .../>
          ...
          <SalesPerson .../>
    </SalesOrderHeader>

</SalesOrder>
<SalesOrder>
  ...
</SalesOrder>

Bu sorgudur:

SELECT SalesOrderID, SalesPersonID, CustomerID,
             (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice
              from Sales.SalesOrderDetail
              WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
              FOR XML AUTO, TYPE),
              (SELECT *
               FROM  (SELECT SalesPersonID, EmployeeID
                    FROM Sales.SalesPerson, HumanResources.Employee
                    WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson
               WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID
         FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 or SalesOrderID=43660
FOR XML AUTO, TYPE;

Sonuç şu şekildedir:

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">
  <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" />
  <SalesPerson SalesPersonID="279" EmployeeID="279" />
</Sales.SalesOrderHeader>
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="117">
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />
  <SalesPerson SalesPersonID="279" EmployeeID="279" />
</Sales.SalesOrderHeader>

TYPE yönergesi xml türü olarak bir sorgu sonucu döndürdüğünden, çeşitli xml veri türü yöntemlerini kullanarak sonuçta elde edilen XML'yi sorgulayabilirsiniz. Daha fazla bilgi için bkz. xml Veri Türü Yöntemleri. Aşağıdaki sorguda aşağıdakileri not edin:

  • Önceki sorgu FROM yan tümcesine eklenir. Sorgu sonucu tablo olarak döndürülür. Eklenen XmlCol diğer adına dikkat edin.

  • SELECT yan tümcesi, XmlCol yan tümcesinde döndürülen FROM'e karşılık gelen bir XQuery tanımlar. query() veri türünün yöntemi, XQuery'nin belirtilmesinde kullanılır. Daha fazla bilgi için bkz. query() Metodu (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),
                  (SELECT *
                   FROM  (SELECT SalesPersonID, EmployeeID
                        FROM Sales.SalesPerson, HumanResources.Employee
                        WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson
                   WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID
             FOR XML AUTO, TYPE)
    FROM Sales.SalesOrderHeader
    WHERE SalesOrderID='43659' or SalesOrderID='43660'
    FOR XML AUTO, TYPE ) as T(XmlCol);
    

Ayrıca bkz.