Share via


İLE xmlnamespaces Namespaces kullanarak ekleme

xmlnamespaces (Transact-sql) ile ad alanı URI destek aşağıdaki şekilde sağlar:

xmlnamespaces for xml sorgular kullanma

İLE xmlnamespaces xml namespaces for xml sorguları eklemek sağlar.Örneğin, aşağıdaki for xml sorgu göz önünde bulundurun:

SELECT ProductID, Name, Color
FROM   Production.Product
WHERE  ProductID=316 or ProductID=317
FOR XML RAW

Bu sonucu verir:

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

for xml sorgu tarafından oluşturulan xml ad alanları eklemek için önce ad ALANLARIYLA yan tümce tümce tümce kullanılarak URI eşleştirmeleri için ad alaný önekini belirtin.Daha sonra değiştirilen aşağıdaki sorgu gösterildiği gibi sorgu adlarını belirterek, ad alaný öneklerini kullanın.Not ile xmlnamespaces yan tümce tümce tümce ad alaný önekini belirtir (ns1) için URI (uri) eşleme.The ns1 prefix is then used in specifying the element and attribute names to be constructed by the FOR XML query.

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

Sonuç xml ad alaný önekleri 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>

İLE xmlnamespaces yan tümce tümce tümce için geçerlidir:

  • Bunu yalnızca raw, otomatik ve yol modes for xml sorgu üzerinde desteklenir.AÇIK modu desteklenmiyor.

  • Yalnızca ad alaný önekleri for xml sorguları etkiler ve xml veri türü yöntemleri, ancak xml parser.Örneğin, hiçbir myNS önek için ad alanı bildirim xml belgesi olduğu için aşağıdaki sorgu hata verir.

  • for xml yönergeleri xmlschema ve xmldata ile xmlnamespaces yan tümce tümce tümce kullanıldığında kullanılamaz.

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

XSINIL direktifini kullanarak

ÖĞELERİ XSINIL yönergesi kullanıyorsanız ile xmlnamespaces yan tümce tümce tümce içinde XSI önek tanımlanamaz.Bunun yerine, öğeleri XSINIL kullandığınızda otomatik olarak eklenir.Aşağıdaki sorguyu kullanır burada null değerler eşleştirilir olan öğeler için öğe merkezli bir xml üreten öğeleri XSINIL xsi: nil True olarak küme öznitelik.

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

Bu sonucu verir:

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

Bir ad alaný öneki bildirmek yerine, varsayılan anahtar sözcüğünü kullanarak varsayýlan bir ad alaný bildirebilirsiniz.for xml sorgu, sonuç XML xml düğümleri için varsayılan ad alanını bağlayacaksınız.Aşağıdaki örnekte, varsayılan bir ad alanı ile birlikte tanımlanan iki ad alaný önekleri ile xmlnamespaces tanımlar.

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

Öğe merkezli bir xml for xml sorgusu oluşturur.Sorgu düğümleri adlandırma, her iki ad alaný önekleri kullandığına dikkat edin.select yan tümce tümce tümcesinde ProductID, Name ve renk bir ad ile herhangi bir önek belirtin.Bu nedenle, karşılık gelen sonuç xml öğeleri varsayılan ad alanına ait.

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

for xml auto modu belirtilen aşağıdaki sorguyu önceki bir benzer olmasıdır.

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

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

Xml ad alanı ve öğeleri XSINIL kullanıldığında, XSI ad alanı dışında önceden tanımlanmış ad alanları kullandığınızda ad alanını açıkça belirtmeniz gerekir bağlama ile xmlnamespaces kullanarak.Aşağıdaki sorgu açıkça önceden tanımlanmış ad alanı URI bağlama için ad alanı önekini 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 ile bu xml şablonu biliyorsunuzdur.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>

Yalnızca xml ad alaný önekini açıkça xmlnamespaces ile tanımlamadan yol modunda sorgu gösterildiği gibi kullanılır.Ayrıca, önek bildirilirse, ad alanı http://www.w3.org/XML/1998/namespace bağlanacak vardır.select yan tümce tümce tümcesinde belirtilen adlar ile xmlnamespaces kullanarak açıkça tanımlanmamış xml ad alanı öneki başvurun.

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

@ Xml: lang öznitelik önceden tanımlanmış xml ad alanını kullanın.Açık xml ad alanı bildirim xml 1.0 sürüm gerektirmediğinden bağlama, sonucu açık bir ad alanı bildirim içeren bağlama.

Bu sonucu verir:

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

Kullanma ile xmlnamespaces xml veri türü yöntemleri ile

The xml Data Type Methods specified in a SELECT query, or in UPDATE when it is the modify() method, all have to repeat the namespace declaration in their prolog.Bu, saat alıcı olabilir.Örneğin, aşağıdaki sorgu ürün modeli kimliği, katalog açıklamaları belirtimini içerir alır.Yani, <Specifications> öğesi yok.

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 sorgu, hem query() ve exist() yöntemleri, önsöz'de aynı ad alanı bildirmek.Örneğin:

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

Alternatif olarak, ilk xmlnamespaces ile birlikte bildirmek ve sorguda ad alaný öneklerini kullanın.Bu durum, query() ve exist() yöntemleri ad alanı bildirimi, önsöz'de dahil etmek zorunda değilsiniz.

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

Unutmayın bir açık bildirim içinde XQuery önsöz ad alaný önekini ve WITH yan tümce tümce tümcesinde tanımlanan varsayılan öğe ad alanı geçersiz kılar.