Udostępnij za pośrednictwem


Przykłady: Za pomocą trybu ścieżka

Poniższe przykłady ilustrują trybu ścieżka do generowania XML z kwerendy WYBIERAJĄCEJ.Wiele z tych kwerend są określane względem instrukcje dokumentów XML, które są przechowywane kolumna instrukcji tabela ProductModel produkcji roweru.Aby uzyskać więcej informacji na temat instrukcji XML zobacz xml Data Type Representation in the AdventureWorks Database.

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

Ta kwerenda określa tryb dla XML ścieżka.

SELECT 
       ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH
go

Następujący wynik jest zorientowane na element XML, których wartości każdej kolumna w wynikowym zestawie zestaw wierszy jest zawijany w elemencie.Ponieważ klauzula SELECT nie określono żadnych aliasów kolumna nazwiska, nazwy elementów podrzędność, generowane są takie same, jak odpowiadające im kolumna nazw w klauzuli SELECT.Dla każdego wiersza w zestawie zestaw wierszy <row> znacznik 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 elementami określono opcję.Zwraca zorientowane na element XML z domyślną <row> element dla każdego wiersza zestaw wyników.

SELECT ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS

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

SELECT ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel')
Go

Wynikowy plik XML będzie miał nazwę elementu do określonego wiersza.

<ProductModel>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
  <ProductModelID>119</ProductModelID>
  <Name>Bike Wash</Name>
</ProductModel>

Jeśli zostanie określony ciąg znaków o zerowej długości, nie został przedstawiony element zawijania.

SELECT ProductModelID,
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('')
Go

Oto wynik:

<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>

Określanie nazwy kolumn przypominających XPath

W następującej kwerendzie nazwę kolumna ProductModelID określone rozpoczyna się od '@' i nie zawiera kreska ułamkowa ('/').Dlatego atrybut <row> element, który zawiera odpowiednią wartość kolumna jest tworzony w wynikowym pliku XML.

SELECT ProductModelID as "@id",
       Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData')
go

Oto wynik:

< 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 katalog główny opcja 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 podobne ścieżka.Na przykład zmienić nazwę kolumna dla Nazwa kolumna "SomeChild/ModelName" i uzyskać XML z hierarchii, jak pokazano w wyniku tego:

<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ż znajduje się kolumna instrukcji XML type, the Query() Metoda XML typ danych jest określona do lokalizacji pobrania.

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

To jest wynik częściowy.Kwerenda określa wartość ManuInstr jako nazwę kolumny, więc kod XML zwracany przez metodę query() jest otoczony tagami <ManuInstr>, tak 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 FOR XML, warto uwzględnić obszary nazw dla <Root> i <ProductModelData> elementy. Można to zrobić, definiując pierwszego prefiks do obszaru nazw wiązania przy użyciu WITH XMLNAMESPACES i prefiksy w kwerendzie FOR XML.Aby uzyskać więcej informacji zobaczDodawanie obszarów nazw przy użyciu WITH XMLNAMESPACES.

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 prefiks MI jest także definiowany w instrukcji WITH XMLNAMESPACES.W wyniku tego metoda query() określonego typu xml nie definiuje prefiksu w prologu kwerendy.Oto 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" >
       <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żka

Dla każdego modelu produktu tej kwerendy tworzy listę wartości, nazwy produktu.Dla każdego IDENTYFIKATORA produktu również tworzy się kwerendę <ProductName> zagnieżdżone elementy, jak pokazano na ten fragment XML:

<ProductModelData ProductModelID="7" ProductModelName="..."  
                  ProductIDs="product id list in the product model" >
  <ProductName>...</ProductName>
  <ProductName>...</ProductName>
  ...
</ProductModelData>

To jest kwerenda, która generuje plik XML, który ma:

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • SELECT zagnieżdżona zwraca listę ProductIDs przy użyciu Data() jako nazwy kolumna.Ponieważ kwerendy określa ciąg pusty, jak nazwa elementu wiersza w FOR XML ścieżka, żaden element nie jest generowany.Zamiast tego lista wartości jest przypisany do atrybut IDProduktu.

  • Drugi SELECT zagnieżdżona pobiera nazwy produktów dla produktów z modelu produktu.Generuje <ProductName> elementy, które są zwracane zawinięty w <ProductNames> element, ponieważ kwerenda określa ProductNames jako nazwy 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>

podkwerenda, tworząc nazwy produktów zwraca wynik w postaci ciąg, który jest entitized, a następnie dodać do pliku XML.W przypadku dodania dyrektywa typu FOR XML PATH (''), type, podkwerenda zwraca wynik w postaci XML typu i entitization nie występuje.

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 obszarów nazw w wynikowym pliku XML

Zgodnie z opisem w Dodawanie obszarów nazw przy użyciu WITH XMLNAMESPACES, można użyć Z XMLNAMESPACES uwzględnienie obszarów nazw w kwerendach trybu ścieżka.Na przykład nazwy określone w klauzula SELECT zawierają prefiksów obszaru nazw.W następującej kwerendzie tryb ścieżka konstrukcji XML z obszarami nazw.

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

The @xml:lang atrybut added to the <English> element is defined in the predefined xml namespace.

Oto wynik:

<Translation>
  <English xml:lang="en">food</English>
  <German xml:lang="ger">Essen</German>
</Translation>

Następująca kwerenda jest podobne do przykładu C, z tą różnicą, że zastosowano XMLNAMESPACES WITH, aby uwzględnić obszary nazw w wyniku XML.Aby uzyskać więcej informacji zobaczDodawanie obszarów nazw przy użyciu WITH XMLNAMESPACES.

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

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

See Also

Concepts