Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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ázvuCol#&2tabulky, kódován jako_x0023_ in the DBOJBECT URL.