Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
I följande exempel visas hur du genererar syskon med hjälp av en kapslad AUTO-lägesfråga. Det enda andra sättet att generera sådan XML är att använda EXPLICIT-läget. Detta kan dock vara besvärligt.
Exempel
Den här frågan konstruerar XML som tillhandahåller försäljningsorderinformation. Detta inkluderar följande:
Information om försäljningsorderhuvud,
SalesOrderID,SalesPersonIDochOrderDate.AdventureWorks2022lagrar den här informationen i tabellenSalesOrderHeader.Detaljinformation om försäljningsorder. Detta inkluderar en eller flera beställda produkter, enhetspriset och den beställda kvantiteten. Den här informationen lagras i tabellen
SalesOrderDetail.Information om säljare. Det här är säljaren som tog beställningen. Tabellen
SalesPersoninnehållerSalesPersonID. För den här frågan måste du ansluta den här tabellen till tabellenEmployeeför att hitta namnet på säljaren.
De två distinkta SELECT frågor som följer genererar XML med en liten skillnad i form.
Den första frågan genererar XML där <SalesPerson> och <SalesOrderHeader> visas som underordnade <SalesOrder>:
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;
I föregående fråga gör den yttersta SELECT-instruktionen följande:
Förfrågar den raduppsättning,
SalesOrder, som anges iFROM-satsen. Resultatet är en XML med ett eller flera<SalesOrder>element.Anger
AUTOläge ochTYPE-direktivet.AUTOläge omvandlar frågeresultatet till XML ochTYPE-direktivet returnerar resultatet som xml- typ.Innehåller två kapslade
SELECT-instruktioner avgränsade med kommatecken. Den första kapsladeSELECThämtar information om försäljningsorder, sidhuvud och information, och den andra kapsladeSELECT-instruktionen hämtar information om säljare.- Den 
SELECT-instruktion som hämtarSalesOrderID,SalesPersonIDochCustomerIDinnehåller en annan kapsladSELECT ... FOR XML-instruktion (medAUTO-läge ochTYPE-direktiv) som returnerar försäljningsorderinformation. 
- Den 
 
Instruktionen SELECT som hämtar säljareinformation förfrågar en raduppsättning SalesPersonsom har skapats i FROM-villkoret. För att få FOR XML-frågor att fungera måste du ange ett namn för den anonyma resultatuppsättning som genereras av FROM-satsen. I det här fallet är det angivna namnet SalesPerson.
Detta är det partiella resultatet:
<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>
...
Följande fråga genererar samma försäljningsorderinformation, förutom att i den resulterande XML-koden visas <SalesPerson> som ett syskon till <SalesOrderDetail>:
<SalesOrder>
    <SalesOrderHeader ...>
          <SalesOrderDetail .../>
          <SalesOrderDetail .../>
          ...
          <SalesPerson .../>
    </SalesOrderHeader>
</SalesOrder>
<SalesOrder>
  ...
</SalesOrder>
Det här är frågan:
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;
Det här är resultatet:
<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>
Eftersom TYPE-direktivet returnerar ett frågeresultat som xml- typ kan du fråga den resulterande XML-koden med hjälp av olika xml- datatypsmetoder. Mer information finns i xml-datatypsmetoder. Observera följande i följande fråga:
Föregående fråga läggs till i
FROM-satsen. Frågeresultatet returneras som en tabell. Observera detXmlColalias som läggs till.Klausulen
SELECTanger ett XQuery motXmlCol, vilket returneras i klausulenFROM. Denquery()metoden för xml- datatyp används för att ange XQuery. Mer information finns i query() Method (xml Data Type).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);