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 de volgende voorbeelden ziet u het gebruik van de PATH-modus bij het genereren van XML vanuit een SELECT-query. Veel van deze query's worden opgegeven op basis van de XML-documenten voor fietsproductieinstructies die zijn opgeslagen in de kolom Instructies van de tabel ProductModel.
Een query voor de PATH-modus specificeren
Deze query geeft een FOR XML PATH-modus op.
USE AdventureWorks2022;
GO
SELECT
ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO
Het volgende resultaat is elementgerichte XML waarbij elke kolomwaarde in de resulterende rijenset in een element wordt verpakt. Omdat de SELECT component geen aliassen voor de kolomnamen opgeeft, zijn de gegenereerde namen van onderliggende elementen hetzelfde als de bijbehorende kolomnamen in de SELECT component. Voor elke rij in de rijset wordt een <row> tag toegevoegd.
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
Het volgende resultaat is hetzelfde als de RAW modusquery met de ELEMENTS opgegeven optie. Het retourneert elementgerichte XML met een standaardelement <row> voor elke rij in de resultatenset.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;
U kunt desgewenst de naam van het rijelement opgeven om de standaardwaarde <row>te overschrijven. De volgende query retourneert bijvoorbeeld het <ProductModel> element voor elke rij in de rijenset.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO
De resulterende XML heeft een opgegeven rijelementnaam.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</ProductModel>
Als u een tekenreeks met lengte nul opgeeft, wordt het wrapping-element niet geproduceerd.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO
Dit is het resultaat:
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
XPath-achtige kolomnamen opgeven
In de volgende query begint de ProductModelID opgegeven kolomnaam met @en bevat geen slashmarkering ('/'). Daarom wordt een kenmerk van het <row> element met de bijbehorende kolomwaarde gemaakt in de resulterende XML.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO
Dit is het resultaat:
<ProductModelData id="122">
<Name>All-Purpose Bike Stand</Name>
</ProductModelData>
<ProductModelData id="119">
<Name>Bike Wash</Name>
</ProductModelData>
U kunt één element op het hoogste niveau toevoegen door de root optie in FOR XMLop te geven.
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Als u een hiërarchie wilt genereren, kunt u path-achtige syntaxis opnemen. Wijzig bijvoorbeeld de kolomnaam voor de Name kolom in 'SomeChild/ModelName' en u verkrijgt XML met hiërarchie, zoals wordt weergegeven in dit resultaat:
<Root>
<ProductModelData id="122">
<SomeChild>
<ModelName>All-Purpose Bike Stand</ModelName>
</SomeChild>
</ProductModelData>
<ProductModelData id="119">
<SomeChild>
<ModelName>Bike Wash</ModelName>
</SomeChild>
</ProductModelData>
</Root>
Naast de productmodel-id en -naam haalt de volgende query de productieinstructielocaties voor het productmodel op. Omdat de kolom Instructies van het XML-type is, wordt de methode van het query()XML-gegevenstype opgegeven om de locatie op te halen.
SELECT ProductModelID AS "@id",
Name,
Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') AS ManuInstr
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Dit is het gedeeltelijke resultaat. Omdat de query ManuInstr als kolomnaam opgeeft, wordt de XML die door de query() methode wordt geretourneerd, verpakt in een <ManuInstr> tag, zoals wordt weergegeven in het volgende:
<Root>
<ProductModelData id="7">
<Name>HL Touring Frame</Name>
<ManuInstr>
<MI:Location xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
<MI:step>...</MI:step>...
</MI:Location>
...
</ManuInstr>
</ProductModelData>
</Root>
In de vorige FOR XML-query wilt u mogelijk naamruimten voor de <Root> en <ProductModelData> elementen opnemen. U kunt dit doen door eerst het voorvoegsel voor naamruimtebinding te definiëren met BEHULP van XMLNAMESPACES en voorvoegsels in de FOR XML-query te gebruiken. Zie Naamruimten toevoegen aan query's met XMLNAMESPACES voor meer informatie.
USE AdventureWorks2022;
GO
WITH XMLNAMESPACES (
'uri1' AS ns1,
'uri2' AS ns2,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' as MI)
SELECT ProductModelID AS "ns1:ProductModelID",
Name AS "ns1:Name",
Instructions.query('
/MI:root/MI:Location
')
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH ('ns2:ProductInfo'), root('ns1:root');
GO
Het MI voorvoegsel wordt ook gedefinieerd in de WITH XMLNAMESPACES. Als gevolg hiervan definieert de query() methode van het opgegeven XML-type het voorvoegsel niet in het queryprolog. Dit is het resultaat:
<ns1:root xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">
<ns2:ProductInfo>
<ns1:ProductModelID>7</ns1:ProductModelID>
<ns1:Name>HL Touring Frame</ns1:Name>
<MI:Location xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" LaborHours="2.5" LotSize="100" MachineHours="3" SetupHours="0.5" LocationID="10" xmlns="">
<MI:step>
Insert <MI:material>aluminum sheet MS-2341</MI:material> into the <MI:tool>T-85A framing tool</MI:tool>.
</MI:step>
...
</MI:Location>
...
</ns2:ProductInfo>
</ns1:root>
Een lijst met waarden genereren met de PATH-modus
Voor elk productmodel maakt deze query een lijst met waarden van product-id's. Voor elke product-ID construeert de query ook <ProductName> geneste elementen, zoals te zien is in dit XML-fragment.
<ProductModelData ProductModelID="7" ProductModelName="..." ProductIDs="product id list in the product model">
<ProductName>...</ProductName>
<ProductName>...</ProductName>
...
</ProductModelData>
Dit is de query die de gewenste XML produceert:
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@ProductModelID",
Name AS "@ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')) AS "@ProductIDs",
(SELECT Name AS "ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')) AS "ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 or ProductModelID=9
FOR XML PATH('ProductModelData');
Let op het volgende uit de vorige query:
De eerste geneste
SELECTretourneert een lijst van ProductIDs doordata()te gebruiken als de kolomnaam. Omdat de query een lege tekenreeks opgeeft als de naamFOR XML PATHvan het rijelement, wordt er geen element gegenereerd. In plaats daarvan wordt de lijst met waarden toegewezen aan hetProductIDkenmerk.De tweede geneste
SELECThaalt productnamen op voor producten binnen het productmodel. Er worden<ProductName>elementen gegenereerd die worden geretourneerd in het<ProductNames>element, omdat de query de kolomnaamProductNamesopgeeft.
Dit is het gedeeltelijke resultaat:
<ProductModelData PId="7" ProductModelName="HL Touring Frame" ProductIDs="885 887 ...">
<ProductNames>
<ProductName>HL Touring Frame - Yellow, 60</ProductName>
<ProductName>HL Touring Frame - Yellow, 46</ProductName>
</ProductNames>
...
</ProductModelData>
<ProductModelData PId="9" ProductModelName="LL Road Frame" ProductIDs="722 723 724 ...">
<ProductNames>
<ProductName>LL Road Frame - Black, 58</ProductName>
<ProductName>LL Road Frame - Black, 60</ProductName>
<ProductName>LL Road Frame - Black, 62</ProductName>
...
</ProductNames>
</ProductModelData>
De subquery waarmee de productnamen worden samengesteld, retourneert het resultaat als een tekenreeks die is getitiseerd en vervolgens aan de XML wordt toegevoegd. Als u de typerichtlijn toevoegt, FOR XML PATH (''), typeretourneert de subquery het resultaat als XML-type en vindt er geen entitisatie plaats.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@ProductModelID",
Name AS "@ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')
) AS "@ProductIDs",
(
SELECT Name AS "ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH (''), type
) AS "ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 OR ProductModelID=9
FOR XML PATH('ProductModelData');
Naamruimten toevoegen in de resulterende XML
Zoals beschreven in Naamruimten toevoegen met BEHULP van XMLNAMESPACES, kunt u MET XMLNAMESPACES naamruimten opnemen in de PATH-modusquery's. Namen die zijn opgegeven in de SELECT-component bevatten bijvoorbeeld naamruimtevoorvoegsels. Met de volgende PATH modusquery wordt XML gemaakt met naamruimten.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
GO
Het @xml:lang kenmerk dat aan het <English> element wordt toegevoegd, wordt gedefinieerd in de vooraf gedefinieerde XML-naamruimte.
Dit is het resultaat:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
De volgende query is vergelijkbaar met voorbeeld C, behalve dat deze wordt gebruikt WITH XMLNAMESPACES om naamruimten in het XML-resultaat op te nemen. Zie Naamruimten toevoegen aan query's met XMLNAMESPACES voor meer informatie.
USE AdventureWorks2022;
GO
WITH XMLNAMESPACES ('uri1' AS ns1, DEFAULT 'uri2')
SELECT ProductModelID AS "@ns1:ProductModelID",
Name AS "@ns1:ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')
) AS "@ns1:ProductIDs",
(
SELECT ProductID AS "@ns1:ProductID",
Name AS "@ns1:ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH , type
) AS "ns1:ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 OR ProductModelID=9
FOR XML PATH('ProductModelData'), root('root');
Dit is het resultaat:
<root xmlns="uri2"
xmlns:ns1="uri1">
<ProductModelData ns1:ProductModelID="7" ns1:ProductModelName="HL Touring Frame" ns1:ProductIDs="885 887 888 889 890 891 892 893">
<ns1:ProductNames>
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="885" ns1:ProductName="HL Touring Frame - Yellow, 60" />
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="887" ns1:ProductName="HL Touring Frame - Yellow, 46" />
...
</ns1:ProductNames>
</ProductModelData>
<ProductModelData ns1:ProductModelID="9" ns1:ProductModelName="LL Road Frame" ns1:ProductIDs="722 723 724 725 726 727 728 729 730 736 737 738">
<ns1:ProductNames>
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="722" ns1:ProductName="LL Road Frame - Black, 58" />
...
</ns1:ProductNames>
</ProductModelData>
</root>