Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
In het volgende voorbeeld ziet u hoe u broers en zussen genereert met behulp van een geneste AUTO-modusquery. De enige andere manier om dergelijke XML te genereren, is door de EXPLICIETe modus te gebruiken. Dit kan echter lastig zijn.
Voorbeeld
Met deze query wordt XML gemaakt die verkoopordergegevens levert. Dit omvat het volgende:
Kopinformatie over verkooporders,
SalesOrderID,SalesPersonIDenOrderDate.AdventureWorks2025slaat deze informatie op in de tabelSalesOrderHeader.Details van verkooporders. Dit omvat een of meer bestelde producten, de eenheidsprijs en de bestelde hoeveelheid. Deze informatie wordt opgeslagen in de
SalesOrderDetailtabel.Informatie van verkoper. Dit is de verkoper die de bestelling heeft genomen. De tabel
SalesPersonbevat deSalesPersonID. Voor deze query moet u deze tabel koppelen aan deEmployeetabel om de naam van de verkoper te vinden.
De twee verschillende SELECT query's die volgen, genereren XML met een klein verschil in vorm.
De eerste query genereert XML waarin <SalesPerson> en <SalesOrderHeader> worden weergegeven als onderliggende elementen van <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;
In de vorige query voert de buitenste SELECT-instructie het volgende uit:
Voer queries uit op de rijset
SalesOrder, die is opgegeven in deFROM-clausule. Het resultaat is een XML met een of meer<SalesOrder>elementen.Hiermee specificeert u de modus van
AUTOen de richtlijnTYPE.AUTO-modus transformeert het queryresultaat in XML, en deTYPE-instructie retourneert het resultaat als xml- type.Bevat twee geneste
SELECTverklaringen gescheiden door een komma. De eerste genesteSELECThaalt verkoopordergegevens, header en details op, en de tweede genesteSELECT-instructie haalt gegevens van de verkoopmedewerker op.- De
SELECT-instructie waarmeeSalesOrderID,SalesPersonIDenCustomerIDzelf worden opgehaald, bevat een andere genesteSELECT ... FOR XML-instructie (metAUTOmodus enTYPEinstructie) die informatie over verkoopordergegevens retourneert.
- De
De SELECT-instructie waarmee de informatie van de verkoper wordt opgehaald, voert een query uit op een rijset, SalesPerson, die is gemaakt in de FROM-clausule. Voor FOR XML queries moet u een naam opgeven voor de anonieme rijenset gegenereerd in de FROM clausule. In dit geval is de opgegeven naam SalesPerson.
Dit is het gedeeltelijke resultaat:
<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>
...
Met de volgende query worden dezelfde verkoopordergegevens gegenereerd, behalve dat in de resulterende XML de <SalesPerson> als een sibling van <SalesOrderDetail>verschijnt.
<SalesOrder>
<SalesOrderHeader ...>
<SalesOrderDetail .../>
<SalesOrderDetail .../>
...
<SalesPerson .../>
</SalesOrderHeader>
</SalesOrder>
<SalesOrder>
...
</SalesOrder>
Dit is de query:
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;
Dit is het resultaat:
<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>
Omdat de TYPE instructie een queryresultaat retourneert als xml- type, kunt u een query uitvoeren op de resulterende XML met behulp van verschillende xml- gegevenstypemethoden. Zie xml-gegevenstypemethodenvoor meer informatie. Noteer in de volgende query het volgende:
De vorige query wordt toegevoegd in de
FROM-clausule. Het queryresultaat wordt geretourneerd als een tabel. Let op deXmlColalias die wordt toegevoegd.De
SELECTclausule specificeert een XQuery voor deXmlColdie is geretourneerd in deFROMclausule. Dequery()methode van het xml- gegevenstype wordt gebruikt bij het opgeven van de XQuery. Zie query() Method (XML-gegevenstype)voor meer informatie.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);