Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Följande exempel illustrerar användningen av PATH-läge för att generera XML från en SELECT-fråga. Många av dessa frågor anges mot XML-dokument för cykeltillverkningsinstruktioner som lagras i kolumnen Instruktioner i tabellen ProductModel.
Ange en PATH-lägesfråga
Den här frågan anger ett FOR XML PATH-läge.
USE AdventureWorks2022;
GO
SELECT
ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO
Följande resultat är elementcentrerad XML där varje kolumnvärde i den resulterande raduppsättningen omsluts i ett element.
SELECT Eftersom satsen inte anger några alias för kolumnnamnen är de underordnade elementnamn som genereras samma som motsvarande kolumnnamn i SELECT -satsen. För varje rad i raduppsättningen läggs en <row> tagg till.
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
Följande resultat är detsamma som lägesfrågan RAW med det ELEMENTS angivna alternativet. Den returnerar elementcentrerad XML med ett standardelement <row> för varje rad i resultatuppsättningen.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;
Du kan också ange radelementets namn för att skriva över standardvärdet <row>. Följande fråga returnerar till exempel elementet <ProductModel> för varje rad i raduppsättningen.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO
Den resulterande XML-koden har ett angivet radelementnamn.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</ProductModel>
Om du anger en sträng med noll längd skapas inte omslutningselementet.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO
Det här är resultatet:
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
Ange XPath-liknande kolumnnamn
I följande fråga börjar det ProductModelID angivna kolumnnamnet med '@' och innehåller inte ett snedstreck ('/'). Därför skapas ett attribut för elementet <row> som har motsvarande kolumnvärde i den resulterande XML-koden.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO
Det här är resultatet:
<ProductModelData id="122">
<Name>All-Purpose Bike Stand</Name>
</ProductModelData>
<ProductModelData id="119">
<Name>Bike Wash</Name>
</ProductModelData>
Du kan lägga till ett enda element på den översta nivån genom att ange alternativet root i FOR XML.
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Om du vill generera en hierarki kan du inkludera PATH-liknande syntax. Du kan till exempel ändra kolumnnamnet för Name kolumnen till "SomeChild/ModelName" så får du XML med hierarki, vilket visas i det här resultatet:
<Root>
<ProductModelData id="122">
<SomeChild>
<ModelName>All-Purpose Bike Stand</ModelName>
</SomeChild>
</ProductModelData>
<ProductModelData id="119">
<SomeChild>
<ModelName>Bike Wash</ModelName>
</SomeChild>
</ProductModelData>
</Root>
Förutom produktmodell-ID och namn hämtar följande fråga tillverkningsinstruktionsplatserna för produktmodellen. Eftersom kolumnen Instruktioner är av xml-typquery() anges metoden för XML-datatyp för att hämta platsen.
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
Det här är det partiella resultatet. Eftersom frågan anger ManuInstr som kolumnnamn, omsluts XML som returneras av query() metoden i en <ManuInstr> tagg enligt följande:
<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>
I föregående FOR XML-fråga kanske du vill inkludera namnrymder för elementen <Root> och <ProductModelData> . Du kan göra detta genom att först definiera prefixet till namnområdesbindningen med hjälp av WITH XMLNAMESPACES och använda prefix i FOR XML-frågan. Mer information finns i Lägga till namnområden i frågor med XMLNAMESPACES.
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
Prefixet MI definieras också i WITH XMLNAMESPACES. Därför definierar inte den query() angivna xml-metoden prefixet i frågeprologen. Det här är resultatet:
<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>
Generera en värdelista med hjälp av PATH-läge
För varje produktmodell skapar den här frågan en värdelista med produkt-ID:t. För varje produkt-ID konstruerar frågan även kapslade <ProductName> element, vilket visas i det här XML-fragmentet:
<ProductModelData ProductModelID="7" ProductModelName="..." ProductIDs="product id list in the product model">
<ProductName>...</ProductName>
<ProductName>...</ProductName>
...
</ProductModelData>
Det här är frågan som genererar den XML du vill använda:
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');
Observera följande från föregående fråga:
Den första kapslade
SELECTreturnerar en lista över ProduktID:n med hjälp avdata()som kolumnnamn. Eftersom frågan anger en tom sträng som radelementnamnet iFOR XML PATHgenereras inget element. I stället tilldelas värdelistan till attributetProductID.Den andra kapslade
SELECThämtar produktnamn för produkter i produktmodellen. Den genererar<ProductName>element som returneras omslutna i elementet<ProductNames>, eftersom frågan angerProductNamessom kolumnnamn.
Detta är det partiella resultatet:
<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>
Underfrågan som konstruerar produktnamnen returnerar resultatet som en sträng som har entitiserats och sedan lagts till i XML-koden. Om du lägger till typdirektivet FOR XML PATH (''), typereturnerar underfrågan resultatet som xml-typ och ingen entitisering sker.
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');
Lägga till namnområden i den resulterande XML-koden
Som beskrivs i Lägga till namnområden med HJÄLP av MED XMLNAMESPACES kan du använda WITH XMLNAMESPACES för att inkludera namnområden i PATH-lägesfrågorna. Namn som anges i SELECT-satsen innehåller till exempel namnområdesprefix.
PATH Följande lägesfråga konstruerar XML med namnområden.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
GO
Attributet @xml:lang som läggs till i elementet <English> definieras i det fördefinierade XML-namnområdet.
Det här är resultatet:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
Följande fråga liknar exempel C, förutom att den använder WITH XMLNAMESPACES för att inkludera namnområden i XML-resultatet. Mer information finns i Lägga till namnområden i frågor med XMLNAMESPACES.
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');
Det här är resultatet:
<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>