Sdílet prostřednictvím


Příklady: Použití automatického režimu

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Následující příklady ilustrují použití režimu AUTO. Mnoho z těchto dotazů je určeno pro dokumenty XML pokynů pro výrobu kol, které jsou uloženy ve sloupci Pokyny tabulky ProductModel v ukázkové databázi AdventureWorks2025.

Příklad: Načtení informací o zákazníkovi, objednávce a podrobnostech objednávky

Tento dotaz načte informace o zákazníkovi, objednávce a detailech objednávky pro konkrétního zákazníka.

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;

Vzhledem k tomu, že dotaz identifikuje aliasy tabulky Cust, OrderHeader, Detail a Product, odpovídající prvky jsou generovány režimem AUTO. Pořadí, ve kterém jsou tabulky identifikovány sloupci zadanými v SELECT klauzuli, určuje hierarchii těchto prvků.

Jedná se o částečný výsledek.

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

Příklad: Zadání funkcí GROUP BY a agregačních funkcí

Následující dotaz vrátí ID jednotlivých zákazníků a počet objednávek, které zákazník požadoval.

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;

Toto je částečný výsledek:

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

Příklad: Zadání počítaných sloupců v režimu AUTO

Tento dotaz vrátí zřetězená jména jednotlivých zákazníků a informace o objednávce. Vzhledem k tomu, že vypočítaný sloupec je přiřazen k nejvnitřnější úrovni, která se v daném bodě zpracování vyskytne, což je v tomto příkladu prvek <SOH>. Zřetězené názvy zákazníků se přidají jako atributy <SOH> elementu ve výsledku.

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;

Toto je částečný výsledek:

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

Pokud chcete načíst prvky <IndividualCustomer>, které mají atribut Name obsahující informace o záhlaví každé prodejní objednávky jako podprvek, dotaz se přepíše pomocí podvýběru. Vnitřní výběr vytvoří dočasnou IndividualCustomer tabulku s vypočítaným sloupcem, který obsahuje názvy jednotlivých zákazníků. Tato tabulka se pak spojí s SalesOrderHeader tabulkou, aby získala výsledek.

V Sales.Customer tabulce jsou uloženy informace o jednotlivých zákaznících včetně PersonID hodnoty pro daného zákazníka. Toto PersonID se využívá k nalezení jména kontaktu z tabulky 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.CustomerID FOR XML AUTO;

Toto je částečný výsledek:

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

Příklad: Vrácení binárních dat

Tento dotaz vrátí fotku produktu z ProductPhoto tabulky. ThumbNailPhoto je sloupec varbinary(max) v ProductPhoto tabulce. Ve výchozím nastavení se režim AUTO vrátí s odkazem ve formě relativní adresy URL k virtuálnímu kořenovému adresáři databáze, kde se dotaz provádí. Aby ProductPhotoID bylo možné identifikovat obrázek, musí být zadán atribut klíče. Při načítání odkazu na obrázek, jak je znázorněno v tomto příkladu, musí být v SELECT klauzuli také zadán primární klíč tabulky, aby bylo možné jednoznačně identifikovat řádek.

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

Toto je výsledek:

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

Stejný dotaz se spustí s BINARY BASE64 možností. Dotaz vrátí binární data ve formátu kódování base64.

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

Toto je výsledek:

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

Pokud k načtení binárních dat použijete režim AUTO, vrátí se místo binárních dat odkaz na relativní adresu URL virtuálního kořenového adresáře databáze, ve které byl dotaz proveden. K tomu dojde, pokud není zadána možnost BINARY BASE64.

Když režim AUTO vrátí odkaz na binární data v databázích bez rozlišování malých a malých písmen, ve kterých název tabulky nebo sloupce zadaný v dotazu neodpovídá názvu tabulky nebo sloupce v databázi, spustí se dotaz. Případ vrácený v odkazu ale nebude konzistentní. Například:

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

Toto je výsledek:

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

Může to být problém zejména v případě, že se dotazy dbobject spouštějí v databázi rozlišující velikost písmen. Aby se tomu zabránilo, musí se velikost názvu tabulky nebo sloupce zadaného v dotazech shodovat s případem názvu tabulky nebo sloupce v databázi.

Příklad: Vysvětlení kódování

Tento příklad ukazuje různé kódování, ke kterému dochází ve výsledku.

Vytvořte tuto tabulku:

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

Do tabulky přidejte následující data:

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

Tento dotaz vrátí data z tabulky. Je zadán režim PRO XML AUTO. Binární data jsou vrácena jako odkaz.

SELECT * FROM [Special Chars] FOR XML AUTO;

Toto je výsledek:

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

Toto je proces kódování speciálních znaků ve výsledku:

  • Ve výsledku dotazu jsou speciální znaky XML a URL v vráceném elementu a názvech atributů kódovány pomocí šestnáctkové hodnoty odpovídajícího znaku Unicode. V předchozím výsledku se název <Special Chars> elementu vrátí jako <Special_x0020_Chars>. Název <Col#&2> atributu se vrátí jako <Col_x0023__x0026_2>. Kódují se speciální znaky XML i adresy URL.

  • Pokud hodnoty elementů nebo atributu obsahují některou z pěti standardních entit znaků XML (', "", <, >a &), tyto speciální znaky XML jsou vždy kódovány pomocí kódování znaků XML. V předchozím výsledku je hodnota & v hodnotě atributu <Col1> kódována jako &. Znak # však zůstane #, protože se jedná o platný znak XML, nikoli speciální znak XML.

  • Pokud hodnoty elementů nebo atributů obsahují speciální znaky adresy URL, které mají speciální význam v adrese URL, jsou kódovány pouze v hodnotě ADRESY URL DBOBJECT a jsou kódovány pouze tehdy, když je speciální znak součástí názvu tabulky nebo sloupce. Ve výsledku je znak # , který je součástí názvu Col#&2 tabulky, kódován jako _x0023_ in the DBOJBECT URL.

Viz také