Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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>