Udostępnij przez


Przykłady: Używanie trybu ścieżki

Poniższe przykłady ilustrują trybu ścieżki do generowania XML z kwerendy WYBIERAJĄCEJ.Wiele z tych kwerend są określone przeciwko rowerów wytwarzania instrukcje dokumenty XML, które są przechowywane kolumna instrukcje ProductModel tabela.Aby uzyskać więcej informacji o instrukcji XML, zobacz XML reprezentacji typu danych w bazie danych AdventureWorks2008R2.

Określanie prostą kwerendę trybu ścieżki

Ta kwerenda określa tryb XML PATH.

USE AdventureWorks2008R2;
GO
SELECT 
       ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO

Następujący wynik jest zorientowany na element XML, gdzie zapakowane jest w elemencie wartości każdej kolumna w wynikowym zestawie zestaw wierszy.Ponieważ SELECT Klauzula nie określono żadnych aliasów kolumna nazwy nazwy elementów podrzędność, generowane są takie same, jak odpowiadające im kolumna nazwy w SELECT klauzuli.Dla każdego wiersza w zestawie zestaw wierszy <row> tag zostanie dodany.

<row>

<ProductModelID>122</ProductModelID>

<Name>All-Purpose Bike Stand</Name>

</row>

<row>

<ProductModelID>119</ProductModelID>

<Name>Bike Wash</Name>

</row>

Następujący wynik jest taka sama jak RAW tryb kwerendy z ELEMENTS opcji określonej.Zwraca zorientowany na element XML z domyślną <row> element dla każdego wiersza zestaw wyników.

USE AdventureWorks2008R2;
GO
SELECT ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;

Opcjonalnie można określić nazwę elementu wiersza zastąpić domyślne <row>.Na przykład następujące kwerendy zwraca <ProductModel> element dla każdego wiersza w zestawie zestaw wierszy.

USE AdventureWorks2008R2;
GO
SELECT ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO

Wynikowy XML będzie miał nazwę elementu wiersza.

<ProductModel>

<ProductModelID>122</ProductModelID>

<Name>All-Purpose Bike Stand</Name>

</ProductModel>

<ProductModel>

<ProductModelID>119</ProductModelID>

<Name>Bike Wash</Name>

</ProductModel>

Jeżeli określono ciąg o zerowej długości elementu zawijania nie jest produkowany.

USE AdventureWorks2008R2;
GO
SELECT ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO

Jest to wynikiem:

<ProductModelID>122</ProductModelID>

<Name>All-Purpose Bike Stand</Name>

<ProductModelID>119</ProductModelID>

<Name>Bike Wash</Name>

Podobne wyrażenie XPath określające kolumna nazwy

W następującej kwerendzie ProductModelID rozpoczyna się od '@' określona nazwa kolumna i nie zawierają ukośnik ("/").Dlatego atrybut <row> element, dla którego wartość kolumna odpowiadające jest tworzony w wynikowym XML.

USE AdventureWorks2008R2;
GO
SELECT ProductModelID AS "@id",
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO

Jest to wynikiem:

< ProductModelData id="122">

<Name>All-Purpose Bike Stand</Name>

</ ProductModelData >

< ProductModelData id="119">

<Name>Bike Wash</Name>

</ ProductModelData >

Można dodać jeden element najwyższego poziom, określając root opcji w 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ć hierarchii, można dołączyć składni ścieżki podobne.Na przykład zmienić nazwę kolumna dla Name kolumna "w SomeChild na ModelName" i będzie uzyskiwał XML z hierarchii, jak pokazano na wynik:

<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 modelu produktu i nazwa poniższa kwerenda pobiera instrukcji wytwarzania lokalizacje dla modelu produktu.Ponieważ kolumna instrukcje xml typu, query() metoda xml Typ danych jest określony pobrać lokalizacji.

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ż kwerenda określa jako nazwa kolumna ManuInstr XML zwróconych przez query() metoda zapakowane jest w <ManuInstr> znaczników, 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 poprzedniej kwerendy XML dla możesz dołączyć nazw dla <Root> i <ProductModelData> elementów.Można to zrobić przez definiowanie prefiksu do powiązanie przy użyciu Z XMLNAMESPACES i prefiksy w kwerendzie XML dla obszaru nazw.Aby uzyskać więcej informacji, zobacz Dodawanie nazw przy użyciu XMLNAMESPACES.

USE AdventureWorks2008R2;
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

Należy zauważyć, że MI prefiksu również jest zdefiniowany w WITH XMLNAMESPACES.W wyniku query() metoda xml określony typ nie zdefiniowano prefiksu w prologu kwerendy.Jest to wynikiem:

<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" >

<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 ścieżki

Dla każdego modelu produktu tej kwerendy konstruuje listę wartości identyfikatorów produktu.Dla każdego Identyfikatora produktu także konstrukcje kwerendy <ProductName> zagnieżdżone elementy, jak pokazano w tym fragment XML:

<ProductModelData ProductModelID="7" ProductModelName="..."

ProductIDs="product id list in the product model" >

<ProductName>...</ProductName>

<ProductName>...</ProductName>

...

</ProductModelData>

Jest to kwerenda, która produkuje XML ma:

USE AdventureWorks2008R2;
GO
SELECT ProductModelID     AS "@ProductModelID",
       Name               S "@ProductModelName",
      (SELECT ProductID AS "data()"
       FROM   Production.Product
       WHERE  Production.Product.ProductModelID = 
              Production.ProductModel.ProductModelID
       FOR XML PATH ('')) S "@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');

Poniższe z poprzedniej kwerendy:

  • Zagnieżdżone pierwszego SELECT zwraca listę ProductIDs za pomocą data() jako nazwę kolumna.Ponieważ kwerenda określa ciąg pusty, jak nazwa elementu wiersza w FOR XML PATH, żaden element nie jest generowana.Zamiast tego, lista wartości jest przypisany do ProductID atrybut.

  • Zagnieżdżone drugi SELECT pobiera nazwy produktów dla produktów z modelu produktu.Generuje <ProductName> elementów, które są zwracane zawinięty w <ProductNames> elementu, ponieważ określa kwerendę ProductNames jako nazwę kolumna.

Jest to wynik częściowy:

<ProductModelData PId="7"

ProductModelName="HL Touring Frame"

ProductIDs="885 887 ...">

<ProductNames>

&lt;ProductName&gt;HL Touring Frame - Yellow, 60&lt;/ProductName&gt;

&lt;ProductName&gt;HL Touring Frame - Yellow, 46&lt;/ProductName&gt;</ProductNames>

...

</ProductModelData>

<ProductModelData PId="9"

ProductModelName="LL Road Frame"

ProductIDs="722 723 724 ...">

<ProductNames>

&lt;ProductName&gt;LL Road Frame - Black, 58&lt;/ProductName&gt;

&lt;ProductName&gt;LL Road Frame - Black, 60&lt;/ProductName&gt;

&lt;ProductName&gt;LL Road Frame - Black, 62&lt;/ProductName&gt;

...

</ProductNames>

</ProductModelData>

podzapytanie konstruowania nazwy produktów zwraca wynik jako ciąg znaków jest entitized, a następnie dodane do pliku XML.Jeśli dodasz dyrektywy typu FOR XML PATH (''), type, podzapytanie zwraca wynik w postaci xml występuje typu i nie entitization.

USE AdventureWorks2008R2;
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 nazw w wynikowym pliku XML

Jak opisano w Dodawanie nazw korzystając Z XMLNAMESPACES, XMLNAMESPACES Z umożliwiają uwzględnianie obszarów nazw w ŚCIEŻCE kwerendy trybu.Na przykład nazwy określone w klauzula SELECT obejmują prefiksy obszarów nazw.Następujące PATH kwerendę trybu konstrukcje XML z obszarów nazw.

SELECT 'en'    as "English/@xml:lang",
       'food'  as "English",
       'ger'   as "German/@xml:lang",
       'Essen' as "German"
FOR XML PATH ('Translation')
GO

@xml:lang Dodany atrybut <English> element jest zdefiniowany w przestrzeni nazw xml wstępnie zdefiniowanych.

Jest to wynikiem:

<Translation>

<English xml:lang="en">food</English>

<German xml:lang="ger">Essen</German>

</Translation>

Następująca kwerenda jest podobne przykład C, ale używa WITH XMLNAMESPACES uwzględnienie obszarów nazw XML wynik.Aby uzyskać więcej informacji, zobacz Dodawanie nazw przy użyciu XMLNAMESPACES.

USE AdventureWorks2008R2;
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 wynikiem:

<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>

Zobacz także

Koncepcje