Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
Az alábbi példák a PATH mód használatát szemléltetik az XML SELECT lekérdezésből való generálására. Sok ilyen lekérdezés a ProductModel tábla Utasítások oszlopában tárolt XML-dokumentumok szerint van megadva, amelyek a kerékpárgyártási utasításokat tartalmazzák.
PATH módú lekérdezés megadása
Ez a lekérdezés egy FOR XML PATH módot ad meg.
USE AdventureWorks2022;
GO
SELECT
ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO
Az alábbi eredmény az elemközpontú XML, amelyben az eredményként kapott sorhalmaz minden oszlopértéke egy elembe van csomagolva. Mivel a SELECT záradék nem ad meg aliasokat az oszlopnevekhez, a létrehozott gyermekelemnevek megegyeznek a záradék megfelelő SELECT oszlopnevével. A sorhalmaz minden egyes sorához hozzáad egy címkét <row> .
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
A következő eredmény megegyezik a RAW mód lekérdezésének eredményével, ha meg van adva a ELEMENTS opció. Az eredményhalmaz minden sorához egy alapértelmezett <row> elemet tartalmazó elemközpontú XML-t ad vissza.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;
Megadhatja a sorelem nevét, hogy felülírja az alapértelmezett <row> értéket, ha szükséges. Az alábbi lekérdezés például a <ProductModel> sorhalmaz minden egyes sorának elemét adja vissza.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO
Az eredményként kapott XML-fájlnak egy megadott sorelem-neve lesz.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</ProductModel>
Ha nulla hosszúságú sztringet ad meg, a burkolóelem nem lesz létrehozva.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO
Ez az eredmény:
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
XPath-szerű oszlopnevek megadása
A következő lekérdezésben a ProductModelID megadott oszlopnév "@" karakterrel kezdődik, és nem tartalmaz perjelet ('/'). Ezért az eredményként kapott XML-fájlban létrejön a <row> megfelelő oszlopértéket tartalmazó elem attribútuma.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO
Ez az eredmény:
<ProductModelData id="122">
<Name>All-Purpose Bike Stand</Name>
</ProductModelData>
<ProductModelData id="119">
<Name>Bike Wash</Name>
</ProductModelData>
Egyetlen legfelső szintű elemet adhat hozzá azzal, hogy megadja a root opciót a FOR XML.
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Hierarchia létrehozásához a PATH-szerű szintaxist is használhatja. Módosítsa például az Name oszlop oszlopnevét "SomeChild/ModelName" értékre, és a hierarchiával rendelkező XML-t fogja beszerezni, ahogy az az alábbi eredményben látható:
<Root>
<ProductModelData id="122">
<SomeChild>
<ModelName>All-Purpose Bike Stand</ModelName>
</SomeChild>
</ProductModelData>
<ProductModelData id="119">
<SomeChild>
<ModelName>Bike Wash</ModelName>
</SomeChild>
</ProductModelData>
</Root>
A termékmodell azonosítója és neve mellett az alábbi lekérdezés lekéri a termékmodell gyártási utasítási helyét. Mivel az Utasítások oszlop xml típusú, az query()xml-adattípus metódusa meg van adva a hely lekéréséhez.
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
Ez a részleges eredmény. Mivel a lekérdezés a ManuInstr nevet adja meg oszlopnévként, a query() metódus által visszaadott XML egy <ManuInstr> címkébe van csomagolva, ahogyan az az alábbi ábrán látható:
<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>
Az előző FOR XML-lekérdezésben érdemes lehet névtereket megadni a <Root> és <ProductModelData> elemekhez. Ehhez először meg kell határoznia az előtagokat a névtérkötéshez az XMLNAMESPACES használatával, majd előtagok használatával az XML-lekérdezésben. További információ: Névterek hozzáadása XMLNAMESPACES-sel rendelkező lekérdezésekhez.
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
Az MI előtag szintén meg van határozva a WITH XMLNAMESPACES. Ennek eredményeképpen a query() megadott XML-típus metódusa nem határozza meg az előtagot a lekérdezési prologban. Ez az eredmény:
<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>
Értéklista létrehozása PATH módban
Ez a lekérdezés minden termékmodellhez összeállítja a termékazonosítók értéklistáját. A lekérdezés az egyes termékazonosítókhoz <ProductName> beágyazott elemeket is létrehoz, ahogyan az ebben az XML-töredékben látható:
<ProductModelData ProductModelID="7" ProductModelName="..." ProductIDs="product id list in the product model">
<ProductName>...</ProductName>
<ProductName>...</ProductName>
...
</ProductModelData>
Ez a lekérdezés állítja elő a kívánt XML-t:
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');
Jegyezze fel az előző lekérdezésben szereplő következőket:
Az első beágyazott
SELECTa ProductID-k listáját adja vissza oszlopnévként használvadata(). Mivel a lekérdezés egy üres sztringet ad meg a sorelem nevekéntFOR XML PATH, a rendszer nem hoz létre elemet. Ehelyett az értéklista hozzá van rendelve azProductIDattribútumhoz.A második beágyazott
SELECTbeolvassa a termékmodellben szereplő termékek termékneveit. Olyan<ProductName>elemeket generál, amelyeket az<ProductNames>elembe csomagolva ad vissza, mivel a lekérdezés az oszlopnevetProductNames-ként adja meg.
Ez a részleges eredmény:
<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>
A termékneveket összeállító al-lekérdezés az eredményt karakterláncként adja vissza, entitásként elkészítve, majd hozzáadva az XML-hez. Ha hozzáadja a típus direktívát, FOR XML PATH (''), type az al-lekérdezés xml-típusként adja vissza az eredményt, és nem történik entitássá alakítás.
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');
Névterek hozzáadása az eredményként kapott XML-fájlhoz
A névterek HOZZÁADÁSA XMLNAMESPACES használatával című cikkben leírtak szerint az XMLNAMESPACES használatával névtereket is felvehet a PATH módú lekérdezésekbe. A SELECT záradékban megadott nevek közé tartoznak például a névtér előtagok. Az alábbi PATH módú lekérdezés névterekkel rendelkező XML-t hoz létre.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
GO
Az @xml:lang elemhez <English> hozzáadott attribútum az előre definiált XML-névtérben van definiálva.
Ez az eredmény:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
A következő lekérdezés hasonló a C példához, azzal a kivételrel, hogy névtereket használ WITH XMLNAMESPACES az XML-eredményben. További információ: Névterek hozzáadása XMLNAMESPACES-sel rendelkező lekérdezésekhez.
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');
Ez az eredmény:
<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>