Aracılığıyla paylaş


Örnekler: PATH modunu kullanma

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Aşağıdaki örneklerde, SELECT sorgusundan XML oluştururken PATH modunun kullanımı gösterilmektedir. Bu sorguların çoğu, ProductModel tablosunun Yönergeler sütununda depolanan bisiklet üretim yönergeleri XML belgeleriyle belirtilir.

PATH modu sorgusu belirtme

Bu sorgu for XML PATH modunu belirtir.

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

Aşağıdaki sonuç, sonuçta elde edilen satır kümesindeki her sütun değerinin bir öğeye sarmalandığı öğe merkezli XML'dir. yan tümcesi SELECT sütun adları için herhangi bir diğer ad belirtmediğinden, oluşturulan alt öğe adları yan tümcesindeki SELECT ilgili sütun adlarına benzer. Satır kümesindeki 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>

RAW moduyla ve ELEMENTS seçeneği belirtilerek yapılan sorgunun sonucu ile aşağıdaki sonuç aynıdır. Sonuç kümesindeki her satır için varsayılan <row> öğe içeren öğe merkezli XML döndürür.

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

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

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

Sonuçta elde edilen XML,belirtilen bir satır öğesi adına sahip 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 uzunlukta bir dize belirtirseniz, sarmalayan öğe üretilmez.

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

Sonuç şu şekildedir:

<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 ProductModelID , belirtilen sütun adı '@' ile başlar ve eğik çizgi işareti ('/') içermez. Bu nedenle, ilgili sütun değerine sahip <row> öğesinin bir özelliği, ortaya çıkan XML'de oluşturulur.

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

Sonuç şu şekildedir:

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

FOR XML içinde root seçeneğini belirterek tek bir üst düzey öğe ekleyebilirsiniz.

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

Hiyerarşi oluşturmak için PATH benzeri söz dizimi ekleyebilirsiniz. Örneğin, sütunun sütun adını Name "SomeChild/ModelName" olarak değiştirdiğinizde, bu sonuçta gösterildiği gibi hiyerarşi ile XML alırsınız:

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

Aşağıdaki sorgu, ürün modeli kimliği ve adının yanı sıra, ürün modeli için üretim yönerge konumlarını alır. Yönergeler sütunu xml türünde olduğundan, query() konumu almak için xml veri türü yöntemi belirtilir.

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

Kısmi sonuç budur. Sorgu, sütun adı olarak ManuInstr belirttiği için, query() yöntemi tarafından döndürülen XML, aşağıda gösterildiği gibi bir <ManuInstr> etiketi içinde sarılı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 sorgusunda, <Root> ve <ProductModelData> öğeleri için ad alanlarını eklemek isteyebilirsiniz. Bunu yapmak için öncelikle WITH XMLNAMESPACES kullanarak ad alanı bağlama önekini tanımlayın ve FOR XML sorgusunda önekleri kullanın. Daha fazla bilgi için bkz. WITH XMLNAMESPACES ile Sorgulara Ad Alanları Ekleme.

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

Önek MI ayrıca WITH XMLNAMESPACES içinde tanımlanmıştır. Sonuç olarak, query() belirtilen xml türünün yöntemi sorgu girişinde ön eki tanımlamaz. Sonuç şu şekildedir:

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

PATH modunu kullanarak değer listesi oluşturma

Her ürün modeli için bu sorgu, ürün kimliklerinin bir değer listesini oluşturur. Her ürün kimliği için sorgu, bu XML parçasında gösterildiği gibi iç içe öğeler de oluşturur <ProductName> :

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

bu, istediğiniz XML'yi üreten sorgudur:

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

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

  • İlk iç içe yerleştirilmiş SELECT, data()'i sütun adı olarak kullanarak ProductID'lerin listesini döndürür. Sorgu içinde satır öğesi adı FOR XML PATHolarak boş bir dize belirttiğinden hiçbir öğe oluşturulmaz. Bunun yerine değer listesi özniteliğine ProductID atanır.

  • İkinci iç içe yerleştirilmiş SELECT , ürün modelindeki ürünlerin adlarını alır. Sorgu ProductNames sütun adı olarak belirttiği için <ProductName> öğeleri oluşturur, bu öğeler <ProductNames> öğesi içinde sarmalanmış olarak döndürülür.

Kısmi sonuç şu şekildedir:

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

Ürün adlarını oluşturan alt sorgu, sonucu, başlık haline getirilmiş ve ardından XML'ye eklenen bir dize olarak döndürür. type yönergesini eklerseniz, FOR XML PATH (''), type alt sorgu sonucu xml türünde döndürülür ve hiçbir varlıklaştırma gerçekleşmez.

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

Sonuçta elde edilen XML'de ad alanları ekleme

WITH XMLNAMESPACES Kullanarak Ad Alanları Ekleme bölümünde açıklandığı gibi, PATH modu sorgularına ad alanlarını eklemek için WITH XMLNAMESPACES'i kullanabilirsiniz. Örneğin, SELECT yan tümcesinde belirtilen adlar ad alanı ön eklerini içerir. Aşağıdaki PATH mod sorgusu, ad alanlarıyla XML oluşturur.

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

@xml:lang öğesine eklenen <English> öznitelik, önceden tanımlanmış xml ad alanında tanımlanır.

Sonuç şu şekildedir:

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

Aşağıdaki sorgu, XML sonucuna ad alanlarını dahil etmek için kullandığı WITH XMLNAMESPACES dışında örnek C'ye benzer. Daha fazla bilgi için bkz. WITH XMLNAMESPACES ile Sorgulara Ad Alanları Ekleme.

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

Sonuç şu şekildedir:

<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 bakınız