Aracılığıyla paylaş


Örnekler: auto modunu kullanma

Aşağıdaki örneklerde, xml seçme sorgusu oluşturma yolu modunda kullanımını göstermektedir. Bu sorguların birçoğu karşı bisiklet üretim yönergeleri yönergeleri sütunda depolanan xml belgelerini belirtilen ProductModeltablosu. xml yönergeleri hakkında daha fazla bilgi için bkz: DEL - xml Data Type Representation in the AdventureWorks2008R2 Database.

Basit bir yolu modu sorgusu belirtme

Bu sorgu, for xml path modunu belirtir.

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

Öğe merkezli bir xml nerede her sütun değeri sonuç satır kümesi öğe sarılır aşağıdaki sonucudur. Çünkü SELECTyan sütun adları için herhangi bir diğer ad belirtin değil, oluşturulan alt öğe adlarını karşılık gelen sütun adlarının aynı olan SELECTtümcesi. Her satır satır kümesi için bir <row> etiketi eklenir.

<row>

<ProductModelID>122</ProductModelID>

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

</row>

<row>

<ProductModelID>119</ProductModelID>

<Name>Bike Wash</Name>

</row>

Aşağıdaki sonuç aynıdır RAWmodu sorgusu ile ELEMENTSBelirtilen seçenek. Varsayılan öğe merkezli bir xml döndüren <row> sonuç kümesindeki her satır öğesi.

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

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

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

Sonuç xml-ecek-si olmak a belirtilen satır öğesi adı.

<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 üretilen değil.

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

Sonuç şudur:

<ProductModelID>122</ProductModelID>

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

<ProductModelID>119</ProductModelID>

<Name>Bike Wash</Name>

XPath benzeri sütun adları belirtme

Aşağıdaki sorgu ProductModelID'@' ile başlayan belirtilen sütun adı bir eğik çizgi işareti ('/') içermez. Bu nedenle, öznitelik <row> sonuç xml karşılık gelen sütun değerini sahip öğesi oluşturulur.

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

Sonuç şudur:

< ProductModelData id="122">

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

</ ProductModelData >

< ProductModelData id="119">

<Name>Bike Wash</Name>

</ ProductModelData >

Sen-ebilmek eklemek tek bir üst düzey öğeye belirterek rootseçeneği FOR 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 benzeri sözdizimini içerebilir. Örneğin, sütun adını değiştirmek Name"SomeChild/ModelName" sütunu ve bu sonucu gösterildiği gibi hiyerarşi, xml alacaktır:

<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 talimat alır ürün modeli için yerler. Yönergeleri sütun olduğundan xmltürü, query()yöntemi xmlyerini almak için belirtilen veri türü.

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 bir sonucudur. Tarafından döndürülen xml sorgu sütun ManuInstrFROM belirtir çünkü query()yöntemi sarılı olarak bir <ManuInstr>etiketi aşağıdaki gösterildiği gibi:

<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 sorgu için ad alanları eklemek isteyebilirsiniz <Root> ve <ProductModelData> öğeleri. Bunu ilk WITH xmlnamespaces kullanarak ve önekleri for xml sorgu kullanarak bağlama ad alanı öneki tanımlayarak. Daha fazla bilgi için, bkz. İle sorguları WITH xmlnamespaces NameSpaces eklemek.

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

Dikkat MIöneki tanımlı da WITH XMLNAMESPACES. Sonuç olarak, query()yöntemi xmlbelirtilen türü değil tanımlamak önek sorgu giriş. Sonuç şudur:

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

path modu kullanarak bir değer listesi oluşturuluyor

Her bir ürün modeli için bu sorgu, ürün kimlikleri değer listesini oluşturur. Her ürün kimliği, sorgu yapıları da <ProductName> iç içe geçmiş öğeler, bu xml bölümü gösterildiği gibi:

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

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

<ProductName>...</ProductName>

<ProductName>...</ProductName>

...

</ProductModelData>

Bu istediğiniz xml üretir sorgudur:

USE AdventureWorks2012;
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');

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

  • İlk iç içe SELECTkullanarak ProductIDs listesini döndürür data()sütun adı olarak. Sorgu satır öğesi adı olarak boş bir dize belirtir çünkü FOR XML PATH, hiçbir öğe oluşturulur. Değer listesi yerine atanan ProductIDözniteliği.

  • İkinci iç içe SELECTÜrünler Ürün modeli için ürün adlarını alır. Oluşturduğu <ProductName> içinde kaydırılan döndürülen öğeler <ProductNames> öğesi, sorgu belirtir çünkü ProductNamessütun adı olarak.

Bu kısmi bir sonucudur:

<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ı oluşturma sorgu sonucu entitized ve sonra xml ekledi bir dizge olarak döndürür. Type yönergesi eklerseniz, FOR XML PATH (''), type, sorgu sonucu verir xmltürü ve hiçbir entitization oluşur.

USE AdventureWorks2012;
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');

Sonuç xml ad alanları ekleme

Açıklandığı gibi xmlnamespaces Namespaces kullanarak ekleme, xmlnamespaces path modu sorguları namespaces eklemek için kullanabilirsiniz. Örneğin, select yan tümcesinde belirtilen adları ad alanı önekleri içerir. Aşağıdaki PATHmodu sorgusu oluşturur xml ad alanlarıyla.

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

@xml:langEkledi özniteliği <English>öğesi önceden tanımlanmış xml ad alanında tanımlanır.

Sonuç şudur:

<Translation>

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

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

</Translation>

O uses dışında aşağıdaki sorgu örnek c, benzer olan WITH XMLNAMESPACESxml sonuç ad alanları dahil etmek. Daha fazla bilgi için, bkz. İle sorguları WITH xmlnamespaces NameSpaces eklemek.

USE AdventureWorks2012;
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');

Sonuç şudur:

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

Ayrıca bkz.

Kavramlar

for xml ile ham modunu kullanın