Aracılığıyla paylaş


Örnekler: yol modunu kullanma

Aşağıdaki örnekler, bir SELECT sorgusu XML oluşturma, yol modu kullanımını göstermektedir.Bu sorgular birçok yönergeleri ProductModel tablo yönergeleri sütunda depolanan XML belgeleri üretim bisiklet karşı belirtilmedi.XML yönergeleri hakkında daha fazla bilgi için bkz: XML veri türü temsili AdventureWorks veritabanındaki.

Bir basit yol modu sorgusu belirtme

Bu sorgu IÇIN XML yol modu belirtir.

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

Sonuç kümesi sütun değeri her bir öğe burada kaydırılmıştır öğe merkezli bir XML aşağıdaki sonucudur.SELECT yan tümce sütun adları için herhangi bir diğer ad belirtmek için oluşturulan alt öğe adlarını karşılık gelen sütun adlarının SELECT yan tümcesinde ile aynıdır.Satır kümesi içindeki her satırı için bir <row> Etiket eklenir.

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

Aşağıdaki sonucu RAW modunda sorgu öğelerle aynı olan seçenek belirtildi.Varsayılan öğe merkezli bir XML geri döndürür <row> Sonuç kümesindeki her bir satır öğesi.

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

Isteğe bağlı olarak varsayılan üzerine yazmak için bir satır öğesi adı belirtin <row>. Örneğin, aşağıdaki döndürür sorgulayabilir. <ProductModel> satır kümesi içindeki her satırı için öğe.

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

Sonuç XML, belirtilen satır bir öğe adı olacaktır.

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

Sıfır uzunluklu bir dize belirtirseniz, kaydırma öğesi oluşturulur.

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

Bu sonucu oluşur:

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

XPath benzeri sütun adlarını belirtme

Aşağıdaki sorguda Productmodelıd sütun adı '@' ile başlar ve belirtilen bir eğik çizgi işareti ('/') yok.Bu nedenle, bir öznitelik <row> karşılık gelen sütun değerini içeren bir öğe sonuç XML içinde oluşturulur.

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

Bu sonucu oluşur:

< ProductModelData id="122">
    <Name>All-Purpose Bike Stand</Name>
</ ProductModelData >
< ProductModelData id="119">
    <Name>Bike Wash</Name>
</ ProductModelData >

Tek bir üst düzey öğe belirterek ekleyebilirsiniz kök seçeneği IÇIN XML.

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

Bir hiyerarşi oluşturmak için , yol-benzer bir sözdizimi içerebilir.Örneğin, sütun adını değiştirmek Ad Bu sonucu gösterilen sütun ve "SomeChild/ModelName" hiyerarşisiyle, XML edinin:

<Root>
  <ProductModelData id="122">
    <SomeChild>
      <ModelName>All-Purpose Bike Stand</ModelName>
    </SomeChild>
  </ProductModelData>
  <ProductModelData id="119">
    <SomeChild>
      <ModelName>Bike Wash</ModelName>
    </SomeChild>
  </ProductModelData>
</Root>

Ürün modeli KIMLIĞI ve adı yanı sıra, aşağıdaki sorgu üretim yönergenin alır ürün modeli için bir konum.Yönergeleri sütun, çünkü XML type, the Query() yöntemXML veri türü yerini almak üzere belirtildi.

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

Bu kısmi kaynaklanır.Sorgu bir sütun adı olarak ManuInstr belirtir çünkü XML olarak döndürülen Query() Aşağıdaki gösterildiği gibi etiketin içinde <ManuInstr> yöntem kaydırılmıştır:

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

Önceki FOR XML sorguda için bir ad eklemek isteyebilirsiniz <Root> ve <ProductModelData> öğeleri. Ilk WITH XMLNAMESPACES kullanıp önekleri IÇIN XML sorguda kullanarak bağlama ad boşluğu öneki tanımlayarak bunu yapabilirsiniz.Daha fazla bilgi için bkz:XMLNAMESPACES Namespaces kullanarak ekleme.

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

Dikkat mi öneki, WITH XMLNAMESPACES de tanımlanır.Sonuç olarak, Query() yöntemXML belirtildi, önek sorgu giriş tanımlamıyor.Bu sonucu oluşur:

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

yol modunu kullanarak bir değer listesi oluşturma

Bu sorgu, her bir ürün modeli için ürün kimliklerinden değer listesi oluşturur.Her bir ürün KIMLIĞI için sorgu da oluşturur... <ProductName> iç içe geçmiş öğeleri (gösterildiği bu XML parçası olarak):

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

Istediğiniz XML üreten sorgudur:

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

Önceki sorgudan aşağıdakilere dikkat edin:

  • Iç içe geçmiş ilk SELECT kullanarak ProductIDs listesini verir... Data() sütun adı.Sorgu IÇIN XML yol satır öğesi adı boş bir dize belirtir çünkü hiçbir öğe oluşturulur.Bunun yerine, değer listesi için ÜrünNo özniteliği atanır.

  • Ikinci iç içe geçmiş SEÇME, ürünler, ürün modeli için ürün adlarını alır.Onu oluşturur. <ProductName> öğeleri, içinde kaydırılmış döndürülen <ProductNames> öğe, çünkü bu sorguyu ProductNames sütun adı olarak belirtir.

Bu kısmi kaynaklanır:

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

Ürün adlarının oluşturarak alt sorgu sonuç entitized ve sonra XML için eklenen bir dize olarak döndürür.Tür emrini eklerseniz FOR XML PATH (''), type, alt sorgunun sonucu olarak verir... XML türü ve hiçbir entitization oluşur.

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

Sonuç XML'DE ad alanları ekleme

' De açıklandığı gibi XMLNAMESPACES Namespaces kullanarak ekleme, WITH XMLNAMESPACES yol modu sorgularda ad eklemek için kullanabilirsiniz.Örneğin, SELECT yan tümcesinde belirtilen adlar, ad önekleri içerir.Aşağıdaki yol modu sorgusunu, XML ad alanları ile oluşturur.

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 öznitelik added to the <English> element is defined in the predefined xml namespace.

Bu sonucu oluşur:

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

Ad XML sonucu eklemek için WITH XMLNAMESPACES kullanan aşağıdaki sorgu örneği C benzer.Daha fazla bilgi için bkz:XMLNAMESPACES Namespaces kullanarak ekleme.

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

Bu sonucu oluşur:

<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