Aracılığıyla paylaş


WITH XMLNAMESPACES kullanarak sorgulara ad alanları ekleme

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

WITH XMLNAMESPACES (Transact-SQL) aşağıdaki şekilde ad alanı URI desteği sağlar:

  • XML Oluşturma işlemi yapılırken, FOR XML sorguları kullanıldığında URI ile ad alanı ön eki eşlemesi sağlanabilir hale gelir.

  • ad alanını URI eşlemesine xml Veri Türü Yöntemleri'nin statik ad alanı bağlamında kullanılabilir hale getirir.

XML sorguları için XMLNAMESPACES ile kullanma

WITH XMLNAMESPACES, FOR XML sorgularına XML ad alanlarını eklemenize olanak tanır. Örneğin, aşağıdaki FOR XML sorgusunu göz önünde bulundurun:

SELECT ProductID, Name, Color
FROM   Production.Product
WHERE  ProductID IN (316, 317)
FOR XML RAW;

Sonuç şu şekildedir:

<row ProductID="316" Name="Blade" />
<row ProductID="317" Name="LL Crankarm" Color="Black" />

FOR XML sorgusu tarafından inşa edilen XML'ye ad alanları eklemek için, önce WITH NAMESPACES yan tümcesini kullanarak URI eşlemelerine ad alanı ön ekini belirtin. Ardından, aşağıdaki değiştirilmiş sorguda gösterildiği gibi sorgudaki adları belirtirken ad alanı ön eklerini kullanın. WITH XMLNAMESPACES yan tümcesi, URI (ns1) eşlemesine ad alanı ön ekini (uri) belirtir. ns1 ön eki daha sonra FOR XML sorgusu tarafından oluşturulacak öğe ve öznitelik adlarının belirtilmesinde kullanılır.

WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
       Name      as 'ns1:Name',
       Color     as 'ns1:Color'
FROM  Production.Product
WHERE ProductID IN (316, 317)
FOR XML RAW ('ns1:Prod'), ELEMENTS;

XML sonucu ad alanı ön eklerini içerir:

<ns1:Prod xmlns:ns1="uri">
  <ns1:ProductID>316</ns1:ProductID>
  <ns1:Name>Blade</ns1:Name>
</ns1:Prod>
<ns1:Prod xmlns:ns1="uri">
  <ns1:ProductID>317</ns1:ProductID>
  <ns1:Name>LL Crankarm</ns1:Name>
  <ns1:Color>Black</ns1:Color>
</ns1:Prod>

Aşağıdakiler WITH XMLNAMESPACES yan tümcesi için geçerlidir:

  • Yalnızca FOR XML sorgularının RAW, AUTO ve PATH modlarında desteklenir. AÇIK modu desteklenmez.

  • Yalnızca FOR XML sorgularının ad alanı ön eklerini ve xml veri türü yöntemlerini etkiler, ancak XML ayrıştırıcısını etkilemez. Örneğin, aşağıdaki sorgu bir hata döndürür çünkü XML belgesinde myNS ön eki için ad alanı bildirimi yoktur.

  • BİR WITH XMLNAMESPACES yan tümce kullanıldığında, FOR XML yönergeleri, XMLSCHEMA ve XMLDATA kullanılamaz.

    CREATE TABLE T (x xml);
    GO
    WITH XMLNAMESPACES ('https://abc' as myNS )
    INSERT INTO T VALUES('<myNS:root/>');
    GO
    

XSINIL yönergesini kullanma

ELEMENTS XSINIL yönergesini kullanıyorsanız WITH XMLNAMESPACES yan tümcesinde xsi ön ekini tanımlayamazsınız. Bunun yerine, ELEMENTS XSINIL kullandığınızda otomatik olarak eklenir. Aşağıdaki sorgu, null değerlerin xsi:nil özniteliği True olarak ayarlanmış öğelerle eşlendiği öğe merkezli XML oluşturan ELEMENTS XSINIL kullanır.

WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
       Name      as 'ns1:Name',
       Color     as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL;

Sonuç şu şekildedir:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="uri">
  <ns1:ProductID>316</ns1:ProductID>
  <ns1:Name>Blade</ns1:Name>
  <ns1:Color xsi:nil="true" />
</row>

Varsayılan ad alanlarını belirtme

Ad alanı ön eki bildirmek yerine, DEFAULT anahtar sözcüğünü kullanarak varsayılan ad alanını bildirebilirsiniz. FOR XML sorgusunda, sonuçta elde edilen XML'de varsayılan ad alanını XML düğümlerine bağlar. Aşağıdaki örnekte, WITH XMLNAMESPACES, varsayılan ad alanıyla birlikte tanımlanan iki ad alanı ön ekini tanımlar.

WITH XMLNAMESPACES ('uri1' as ns1,
                    'uri2' as ns2,
                    DEFAULT 'uri2')
SELECT ProductID,
      Name,
      Color
FROM Production.Product
WHERE ProductID IN (316, 317)
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS;

FOR XML sorgusu, öğe merkezli XML oluşturur. Sorgu, adlandırma düğümlerinde her iki ad alanı ön ekini de kullanır. SELECT yan tümcesinde ProductID, Name ve Color herhangi bir ön ek içeren bir ad belirtmez. Bu nedenle, sonuçta elde edilen XML'deki ilgili öğeler varsayılan ad alanına aittir.

<ns2:root xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">
  <ns1:Product>
    <ProductID>316</ProductID>
    <Name>Blade</Name>
  </ns1:Product>
  <ns1:Product>
    <ProductID>317</ProductID>
    <Name>LL Crankarm</Name>
    <Color>Black</Color>
  </ns1:Product>
</ns2:root>

Aşağıdaki sorgu, FOR XML AUTO modunun belirtilmemiş olması dışında önceki sorguya benzer.

WITH XMLNAMESPACES ('uri1' as ns1,  'uri2' as ns2,DEFAULT 'uri2')
SELECT ProductID,
      Name,
      Color
FROM Production.Product as "ns1:Product"
WHERE ProductID IN (316, 317)
FOR XML AUTO, ROOT('ns2:root'), ELEMENTS;

Önceden tanımlanmış ad alanlarını kullanma

ELEMENTS XSINIL kullanıldığında xml ad alanı ve xsi ad alanı dışında önceden tanımlanmış ad alanları kullandığınızda, WITH XMLNAMESPACES kullanarak ad alanı bağlamasını açıkça belirtmeniz gerekir. Aşağıdaki sorgu, önceden tanımlanmış ad alanı için URI bağlamasına ad alanı ön ekini açıkça tanımlar (urn:schemas-microsoft-com:xml-sql).

WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-sql' as sql)
SELECT 'SELECT * FROM Customers FOR XML AUTO, ROOT("a")' AS "sql:query"
FOR XML PATH('sql:root');

Sonuç budur. SQLXML kullanıcıları bu XML şablonu hakkında bilgi sahibidir. Daha fazla bilgi için bkz. SQLXML 4.0 Programlama Kavramları .

<sql:root xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:query>SELECT * FROM Customers FOR XML AUTO, ROOT("a")</sql:query>
</sql:root>

Aşağıdaki PATH modu sorgusunda gösterildiği gibi, WITH XMLNAMESPACES içinde açıkça tanımlanmadan yalnızca xml ad alanı ön eki kullanılabilir. Ayrıca ön ek bildirilirse, http://www.w3.org/XML/1998/namespacead alanına bağlı olması gerekir. SELECT yan tümcesinde belirtilen adlar, WITH XMLNAMESPACES kullanılarak açıkça tanımlanmayan xml ad alanı ön ekine başvurur.

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

@xml:lang öznitelikleri önceden tanımlanmış xml ad alanını kullanır. XML sürüm 1.0, xml ad alanı bağlamasının açık bildirimini gerektirmediğinden, sonuç ad alanı bağlamasının açık bir bildirimini içermez.

Sonuç şu şekildedir:

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

XMLNAMESPACES'i XML veri türü yöntemleriyle kullanma

xml Veri Türü Yöntemleri bir SELECT sorgusunda belirtilen veya modify() yöntemi olduğunda UPDATE'te ad alanı bildirimini kendi girişinde yinelemesi gerekir. Bu işlem zaman alabilir. Örneğin, aşağıdaki sorgu, katalog açıklamalarında belirli özellikler içeren ürün modeli kimliklerini alır. Yani, <Specifications> öğesi vardır.

SELECT ProductModelID, CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
    <Product
        ProductModelID= "{ sql:column("ProductModelID") }"
        />
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
    declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     /pd:ProductDescription[(pd:Specifications)]'
    ) = 1;

Önceki sorguda hem query() hem de exist() yöntemleri önsözlerinde aynı ad alanını bildirir. Örneğin:

declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

Alternatif olarak, önce WITH XMLNAMESPACES'i bildirebilir ve sorgudaki ad alanı ön eklerini kullanabilirsiniz. Bu durumda, query() ve exist() yöntemlerinin prologlarında ad alanı bildirimlerini eklemeleri gerekmez.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)
SELECT ProductModelID, CatalogDescription.query('
    <Product
        ProductModelID= "{ sql:column("ProductModelID") }"
        />
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
     /pd:ProductDescription[(pd:Specifications)]'
    ) = 1;
GO

XQuery giriş günlüğündeki açık bir bildirim, WITH yan tümcesinde tanımlanan ad alanı ön ekini ve varsayılan öğe ad alanını geçersiz kılar.

Ayrıca bkz.