Exempel: Använda autoläge

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Följande exempel illustrerar användningen av AUTO-läge. Många av dessa frågor anges mot XML-dokument för cykeltillverkningsinstruktioner som lagras i kolumnen Instruktioner i tabellen ProductModel i exempeldatabasen AdventureWorks2025.

Exempel: Hämta information om kund-, order- och orderinformation

Den här frågan hämtar information om kund-, order- och orderdetaljer för en specifik kund.

USE AdventureWorks2022;
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;

Eftersom frågan identifierar, Cust, OrderHeader, Detailoch Product tabellalias genereras motsvarande element av AUTO läget. Återigen avgör den ordning i vilken tabeller identifieras av de kolumner som anges i SELECT -satsen hierarkin för dessa element.

Det här är det partiella resultatet.

<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>

Exempel: Ange GROUP BY- och aggregeringsfunktioner

Följande fråga returnerar enskilda kund-ID:er och antalet beställningar som kunden har begärt.

USE AdventureWorks2022;
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;

Detta är det partiella resultatet:

<I CustomerID="11000" NoOfOrders="3" />
<I CustomerID="11001" NoOfOrders="3" />
...

Exempel: Ange beräknade kolumner i autoläge

Den här frågan returnerar sammanfogade enskilda kundnamn och orderinformationen. Eftersom den beräknade kolumnen tilldelas till den innersta nivån som påträffades vid den tidpunkten, elementet <SOH> i det här exemplet. De sammanfogade kundnamnen läggs till som attribut för elementet <SOH> i resultatet.

USE AdventureWorks2022;
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;

Detta är det partiella resultatet:

<SOH Name="Jon Yang" SalesOrderID="43793" />
<SOH Name="Eugene Huang" SalesOrderID="43767" />

Om du vill hämta elementen <IndividualCustomer> med attributet Name som innehåller varje försäljningsorderhuvudinformation som ett underelement skrivs frågan om med hjälp av en undermarkering. Det inre valet skapar en tillfällig IndividualCustomer tabell med den beräknade kolumnen som innehåller namnen på de enskilda kunderna. Den här tabellen kopplas sedan till SalesOrderHeader tabellen för att hämta resultatet.

Tabellen Sales.Customer lagrar individuell kundinformation, inklusive PersonID värdet för den kunden. Detta PersonID används sedan för att hitta kontaktnamnet från Person.Person tabellen.

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.CustomerID FOR XML AUTO;

Detta är det partiella resultatet:

<IndividualCustomer Name="Jon Yang">
  <SOH SalesOrderID="43793" />
  <SOH SalesOrderID="51522" />
  <SOH SalesOrderID="57418" />
</IndividualCustomer>
...

Exempel: Returnera binära data

Den här frågan returnerar ett produktfoto från ProductPhoto tabellen. ThumbNailPhoto är en kolumn med varbinary(max) i ProductPhoto tabellen. AUTO-läget returnerar som standard en referens till den binära datan som är en relativ URL till den virtuella roten av databasen där frågan utförs. Nyckelattributet ProductPhotoID måste anges för att identifiera bilden. När du hämtar en bildreferens som illustreras i det här exemplet måste även den primära nyckeln i tabellen anges i SELECT -satsen för att unikt identifiera en rad.

SELECT ProductPhotoID, ThumbNailPhoto
FROM   Production.ProductPhoto
WHERE ProductPhotoID = 70
FOR XML AUTO;

Det här är resultatet:

<Production.ProductPhoto
  ProductPhotoID="70"
  ThumbNailPhoto= "dbobject/Production.ProductPhoto[@ProductPhotoID='70']/@ThumbNailPhoto" />

Samma fråga körs med alternativet BINARY BASE64 . Frågan returnerar binära data i base64-kodat format.

SELECT ProductPhotoID, ThumbNailPhoto
FROM   Production.ProductPhoto
WHERE ProductPhotoID = 70
FOR XML AUTO, BINARY BASE64;

Det här är resultatet:

<Production.ProductPhoto ProductPhotoID="70" ThumbNailPhoto="Base64 encoded photo" />

När du använder AUTO-läge för att hämta binära data returneras som standard en referens till en relativ URL till den virtuella roten i databasen där frågan kördes i stället för binära data. Detta inträffar om alternativet BINARY BASE64 inte har angetts.

När AUTO-läget returnerar en URL-referens till binära data i skiftlägesokänsliga databaser där ett tabell- eller kolumnnamn som anges i frågan inte matchar tabell- eller kolumnnamnet i databasen, körs frågan. Det ärende som returneras i referensen är dock inte konsekvent. Till exempel:

SELECT ProductPhotoID, ThumbnailPhoto
FROM   Production.ProductPhoto
WHERE  ProductPhotoID=70
FOR XML AUTO;

Det här är resultatet:

<Production.PRODUCTPHOTO
  PRODUCTPHOTOID="70"
  THUMBNAILPHOTO= "dbobject/Production.PRODUCTPHOTO[@ProductPhotoID='70']/@ThumbNailPhoto" />

Detta kan vara ett problem, särskilt när dbobject frågor körs mot en skiftlägeskänslig databas. För att undvika detta bör fallet med det tabell- eller kolumnnamn som anges i frågorna matcha fallet med tabell- eller kolumnnamnet i databasen.

Exempel: Förstå kodningen

Det här exemplet visar de olika kodningar som inträffar i resultatet.

Skapa den här tabellen:

CREATE TABLE [Special Chars] (Col1 char(1) primary key, [Col#&2] varbinary(50));

Lägg till följande data i tabellen:

INSERT INTO [Special Chars] VALUES ('&', 0x20), ('#', 0x20);

Den här frågan returnerar data från tabellen. Autoläge för FOR XML har angetts. Binära data returneras som en referens.

SELECT * FROM [Special Chars] FOR XML AUTO;

Det här är resultatet:

<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"
/>

Det här är processen för att koda specialtecken i resultatet:

  • I frågeresultatet kodas de speciella XML- och URL-tecknen i element- och attributnamnen som returneras med hjälp av hexadecimalt värde för motsvarande Unicode-tecken. I föregående resultat returneras elementnamnet <Special Chars> som <Special_x0020_Chars>. Attributnamnet <Col#&2> returneras som <Col_x0023__x0026_2>. Specialtecken för både XML och URL kodas.

  • Om värdena för elementen eller attributet innehåller någon av de fem standard-XML-teckenentiteterna (', "", <, >, och &), kodas dessa speciella XML-tecken alltid med xml-teckenkodning. I föregående resultat kodas värdet & i värdet för attributet <Col1> som &. Men #-tecknet förblir #, eftersom det är ett giltigt XML-tecken och inte ett särskilt XML-tecken.

  • Om värdena för elementen eller attributen innehåller special-URL-tecken som har särskild betydelse i URL:en kodas de endast i DBOBJECT-URL-värdet och kodas endast när specialtecknet ingår i ett tabell- eller kolumnnamn. I resultatet kodas tecknet # som är en del av tabellnamnet Col#&2 som _x0023_ in the DBOJBECT URL.

Se även