İle sorguları WITH xmlnamespaces NameSpaces eklemek
WITH xmlnamespaces (Transact-sql) ad alanı URI destek aşağıdaki şekilde sağlar:
Ne zaman kullanılabilir eşleme URI ad alanı önekini yapar for xml kullanma oluşturmak yoluyla sorgular.
Ad alanı URI eşleştirme için statik ad alanı bağlamında kullanılabilmesini xml veri türü yöntemleri.
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.