Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft 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.
- xml Veri Türü Yöntemleri
- XQuery Dil Referansı (SQL Server)
- XMLNAMESPACES ile (Transact-SQL)
- XML için (SQL Server)