Aracılığıyla paylaş


XMLNAMESPACES Namespaces kullanarak ekleme

İle XMLNAMESPACES (Transact-SQL) ad alanı URI destek aşağıdaki şekilde sağlar:

XMLNAMESPACES FOR XML sorgulardaki ile kullanma

XML ad sorguları için XML içeren XMLNAMESPACES ile sağlar.Örneğin, aşağıdaki sorgu için XML göz önünde bulundurun:

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

Bu sonucu oluşur:

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

FOR XML sorgu tarafından oluşturulmuş XML ad alanları eklemek için ilk ad ile yan tümce kullanarak URI eşlemeleri için ad alaný önekini belirtin.Sonra aşağıdaki değiştirilmiş sorgu içinde gösterilen sorgu adları belirleme, ad alaný öneklerini kullanın.Dikkat ile XMLNAMESPACES yan 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>

Aşağıdaki ile XMLNAMESPACES geçerli yan tümce:

  • Bu yalnızca RAW, AUTO ve yol modlardan FOR XML sorgu üzerinde desteklenir.AÇIK modu desteklenmiyor.

  • Yalnızca sorguları için XML ad alaný önekleri etkiler veXML yöntem, ancak değil XML Ayrıştırıcı. veri türü Örneğin, myNS öneki için herhangi bir ad alaný bildirim XML belgesi olduğu için aşağıdaki sorgu hata verir.

  • İLE XMLNAMESPACES, XMLSCHEMA ve XMLDATA FOR XML yönergelerini kullanılamaz yan tümce kullanılıyor.

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

XSINIL yönerge kullanma

WITH XMLNAMESPACES xsi önek tanımlanamaz yan tümce öğeleri XSINIL yönergesi kullanıyorsanız.Bunun yerine, öğeleri XSINIL kullandığınızda otomatik olarak eklenir.Yeri null değerler eşleştirilir olan öğeleri öğe merkezli XML üreten öğeleri XSINIL aşağıdaki sorguyu kullanırxsi: nil özniteliği true. için küme

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 oluşur:

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

Bir ad alaný öneki bildirmek yerine, varsayılan anahtar sözcüğünü kullanarak varsayýlan bir ad alaný bildirebilirsiniz.FOR XML sorguda, varsayılan ad alanını XML düğümleri sonuç XML bağlayacaksınız.Aşağıdaki örnekte, varsayılan bir ad alanı ile 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üğümü adlandırma, her iki ad alaný önekleri kullandığını unutmayın.SELECT yan tümcesinde, ProductID, adı ve renk adı bir önek ile belirtmeyin.Bu nedenle, oluşturulan XML karşılık gelen elemanları 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.

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

Önceden tanımlanmış ad, xml ad alanını ve ÖĞELERİNİ XSINIL kullanıldığında, xsi ad alanı dışında kullanırken ad bağlama ile XMLNAMESPACES kullanarak açıkça belirtmelisiniz.Aşağıdaki sorguyu açık olarak ö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 hakkında bilgi sahibi değildir.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 modu sorguda gösterildiği gibi kullanılabilir.Ayrıca, önek olarak, ad alanı http://www.w3.org/XML/1998/namespace için bağlanacak bulunur.SELECT belirtilen adlar yan tümce ile XMLNAMESPACES kullanılarak açıkça tanımlanmamış xml ad alaný önekini bakın.

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ış bir xml ad alanını kullanın.Xml ad alanı bağın açık bildirimi XML 1.0 sürüm gerektirmediğinden, sonucu açık bir bildirim ad alanı bağın içermez.

Bu sonucu oluşur:

<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 işlem uzun sürebilir.Örneğin, aşağıdaki sorgu, ürün modeli kimliği, katalog açıklamaları belirtimi ekleme alır.Olan,<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 sorguda hemQuery() aynı ad alanında, giriş. ve exist() yöntemleri bildirmek Örneğin:

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

Alternatif olarak, ilk XMLNAMESPACES ile bildirmek ve sorguda ad alaný öneklerini kullanın.Bu durum,Query() ve exist() yöntem, giriş. ad alanı bildirimi eklemek olmayan

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

Not bir açık XQuery giriş bildiriminde ad alanı önekini ve ile yan tümcesinde tanımlanan varsayılan öğe ad alanı geçersiz kılar.