Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
W poniższych przykładach pokazano użycie trybu PATH w generowaniu kodu XML z zapytania SELECT. Wiele z tych zapytań jest określonych względem dokumentów XML instrukcji produkcji rowerów, które są przechowywane w kolumnie Instrukcje tabeli ProductModel.
Określanie zapytania trybu PATH
To zapytanie określa tryb FOR XML PATH.
USE AdventureWorks2022;
GO
SELECT
ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO
Poniższy wynik to kod XML skoncentrowany na elementach, w którym każda wartość kolumny w wynikowym zestawie wierszy jest opakowana w element. Ponieważ klauzula SELECT nie określa żadnych aliasów nazw kolumn, wygenerowane nazwy elementów podrzędnych są takie same jak odpowiadające im nazwy kolumn w klauzuli SELECT . Dla każdego wiersza w zestawie wierszy jest dodawany <row> tag.
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
Poniższy wynik jest taki sam jak zapytanie w trybie RAW z określoną opcją ELEMENTS. Zwraca kod XML skoncentrowany na elementach z elementem domyślnym <row> dla każdego wiersza w zestawie wyników.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;
Opcjonalnie możesz określić nazwę elementu wiersza, aby zastąpić wartość domyślną <row>. Na przykład następujące zapytanie zwraca <ProductModel> element dla każdego wiersza w zestawie wierszy.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO
Wynikowy kod XML będzie miał określoną nazwę elementu wiersza.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</ProductModel>
Jeśli określisz ciąg o zerowej długości, element zawijania nie zostanie wygenerowany.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO
Jest to wynik:
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
Określanie nazw kolumn przypominających ścieżkę XPath
W poniższym zapytaniu określona ProductModelID nazwa kolumny zaczyna się od znaku "@" i nie zawiera znaku ukośnika ('/'). W związku z tym atrybut <row> elementu, który ma odpowiednią wartość kolumny, jest tworzony w wynikowym kodzie XML.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO
Jest to wynik:
<ProductModelData id="122">
<Name>All-Purpose Bike Stand</Name>
</ProductModelData>
<ProductModelData id="119">
<Name>Bike Wash</Name>
</ProductModelData>
Możesz dodać jeden element najwyższego poziomu, określając opcję root w pliku FOR XML.
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData'), root ('Root');
GO
Aby wygenerować hierarchię, możesz uwzględnić składnię podobną do ścieżki. Na przykład zmień nazwę kolumny na Name "SomeChild/ModelName" i uzyskasz kod XML z hierarchią, jak pokazano w tym wyniku:
<Root>
<ProductModelData id="122">
<SomeChild>
<ModelName>All-Purpose Bike Stand</ModelName>
</SomeChild>
</ProductModelData>
<ProductModelData id="119">
<SomeChild>
<ModelName>Bike Wash</ModelName>
</SomeChild>
</ProductModelData>
</Root>
Oprócz identyfikatora i nazwy modelu produktu następujące zapytanie pobiera lokalizacje instrukcji produkcyjnych dla modelu produktu. Ponieważ kolumna Instrukcje jest typu xml, określono metodę typu danych xml, aby pobrać lokalizację.
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
Jest to wynik częściowy. Ponieważ zapytanie określa ManuInstr jako nazwę kolumny, kod XML zwrócony przez metodę query() jest opakowany w tag <ManuInstr>, jak pokazano poniżej:
<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>
W poprzednim zapytaniu FOR XML możesz uwzględnić przestrzeń nazw dla elementów <Root> i <ProductModelData>. Można to zrobić, definiując najpierw prefiks do powiązania przestrzeni nazw przy użyciu funkcji WITH XMLNAMESPACES i używając prefiksów w zapytaniu FOR XML. Aby uzyskać więcej informacji, zobacz Dodawanie przestrzeni nazw do zapytań za pomocą funkcji 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
Prefiks MI jest również zdefiniowany w pliku WITH XMLNAMESPACES. W rezultacie określona query() metoda typu xml nie definiuje prefiksu w prologu zapytania. Jest to wynik:
<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>
Generowanie listy wartości przy użyciu trybu PATH
Dla każdego modelu produktu to zapytanie tworzy listę wartości identyfikatorów produktów. Dla każdego identyfikatora produktu zapytanie konstruuje <ProductName> również zagnieżdżone elementy, jak pokazano w tym fragmentcie XML:
<ProductModelData ProductModelID="7" ProductModelName="..." ProductIDs="product id list in the product model">
<ProductName>...</ProductName>
<ProductName>...</ProductName>
...
</ProductModelData>
Jest to zapytanie, które generuje odpowiedni kod XML:
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');
Zwróć uwagę na następujące elementy z poprzedniego zapytania:
Pierwsza zagnieżdżona
SELECTzwraca listę identyfikatorów ProductID, używającdata()jako nazwy kolumny. Ponieważ zapytanie określa pusty ciąg jako nazwę elementu wiersza w plikuFOR XML PATH, żaden element nie jest generowany. Zamiast tego lista wartości jest przypisywana do atrybutuProductID.Drugi zagnieżdżony
SELECTpobiera nazwy produktów dla produktów w modelu produktu. Generuje elementy<ProductName>, które są zwracane w elemencie<ProductNames>, ponieważ zapytanie określaProductNamesjako nazwę kolumny.
Jest to wynik częściowy:
<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>
Podzapytanie konstruujące nazwy produktów zwraca wynik jako ciąg znaków, który jest zakodowany w postaci encji, a następnie dodany do XML. Jeśli dodasz dyrektywę typu , FOR XML PATH (''), typepodzapytywanie zwraca wynik jako typ xml i nie wystąpi entitization.
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');
Dodawanie przestrzeni nazw w wynikowym pliku XML
Zgodnie z opisem w artykule Dodawanie przestrzeni nazw przy użyciu FUNKCJI XMLNAMESPACES można użyć funkcji WITH XMLNAMESPACES, aby uwzględnić przestrzenie nazw w zapytaniach trybu PATH. Na przykład nazwy określone w klauzuli SELECT zawierają prefiksy przestrzeni nazw.
PATH Następujące zapytanie trybu konstruuje kod XML z przestrzeniami nazw.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
GO
Atrybut @xml:lang dodany do <English> elementu jest zdefiniowany w wstępnie zdefiniowanej przestrzeni nazw XML.
Jest to wynik:
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
Poniższe zapytanie jest podobne do przykładu C, z tą różnicą, że używa WITH XMLNAMESPACES do uwzględnienia przestrzeni nazw w wyniku XML. Aby uzyskać więcej informacji, zobacz Dodawanie przestrzeni nazw do zapytań za pomocą funkcji 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');
Jest to wynik:
<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>