Aracılığıyla paylaş


İle sorguları WITH xmlnamespaces NameSpaces eklemek

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

WITH xmlnamespaces for xml sorgular kullanma

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

Sonuç şudur:

<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 önce ad ile yan tümcesi kullanılarak URI eşleştirmeleri için ad alanı önekini belirtin. Ardından, aşağıdaki değiştirilmiş sorgu gösterildiği gibi sorgu adlarını belirtirken ad alanı öneklerini kullanın. Not xmlnamespaces WITH yan tümcesi ad alanı önekini belirtir (ns1) için URI (uri) eşleme. ns1Öneki sonra kullanılan öğe ve öznitelik adları belirtme for xml sorgu tarafından inşa edilecek.

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

xml sonuç 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>

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

  • Sadece raw, auto ve yol modları for xml sorguları desteklenmiyor. Açık modu desteklenmiyor.

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

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

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

XSINIL yönergesi

elements XSINIL yönergesi kullanıyorsanız xmlnamespaces WITH yan tümcesinde xsi önek tanımlanamaz. Bunun yerine, elements XSINIL kullandığınızda otomatik olarak eklenir. Öğe merkezli bir xml nerede boş değerlere sahip öğeleri için eşleştirilir üreten elements XSINIL aşağıdaki sorguyu kullanır xsi: Nil öznitelik kümesi True.

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ç şudur:

<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 bildirimi yerine, varsayılan anahtar sözcük kullanarak varsayılan bir ad alanı bildirebilirsiniz. for xml sorgu, bu xml düğümleri sonuç XML 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 için WITH 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ümcesinde, ProductID, Name ve renkli bir ad ile herhangi bir önek belirtmeyin. Bu nedenle, ilgili öğeleri sonuç XML 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 XSI namespace elements XSINIL kullanıldığında, önceden tanımlanmış ad alanları kullandığınızda ad bağlama WITH xmlnamespaces kullanarak açıkça belirtmeniz gerekir. Aşağıdaki sorgu açıkça tanımlanmış ad alanı URI bağlama 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 bu xml şablonu ile tanıdık. 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ı öneki açıkça xmlnamespaces içindeki tanımlamadan aşağıdaki yolu modunda sorgu gösterildiği gibi kullanılır. Ayrıca, önek bildirilirse, ad http://www.w3.org/XML/1998/namespace kalmayı vardır. select yan tümcesinde belirtilen adlar xml ad alanı önekini xmlnamespaces kullanarak açıkça tanımlanmamış 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 tanımlanmış xml ad alanı kullanın. xml 1.0 sürümü xml ad alanı bağlama açık beyanı gerektirmediğinden, sonuç ad bağlama açık bir bildirim içermeyecektir.

Sonuç şudur:

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

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

Xml veri türü yöntemleri ne zaman bir seçme sorgusu veya güncelleştirme belirtilen modify() yöntemi, tüm kendi giriş ad alanı bildiriminde tekrarlamak zorunda. Bu, zaman 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 bulunmaktadı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 sorgu, hem query() ve exist() yöntemleri bildirmek aynı ad alanında kendi Önsöz. Örneğin:

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

Alternatif olarak, xmlnamespaces ilk ilan ve sorguda ad alanı öneklerini kullanın. Bu durumda, query() ve exist() yöntemleri ad alanı bildirimi kendi giriş eklemek 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

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

Ayrıca bkz.

Başvuru

xmlnamespaces (Transact-sql)

xml (SQL Server)

Diğer Kaynaklar

XML veri türü yöntemleri

XQuery dil başvurusu (SQL Server)