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.
Bir ifadenin bağlamı, onu analiz etmek ve değerlendirmek için kullanılan bilgidir. Aşağıda, XQuery'nin değerlendirildiği iki aşama yer almaktadır:
Statik bağlam - Bu sorgu derleme aşamasıdır. Mevcut bilgilere dayanarak, sorgu bu statik analiz sırasında bazen hatalar ortaya çıkar.
Dinamik bağlam - Bu sorgu yürütme aşamasıdır. Bir sorguda sorgu derleme sırasında hatalar gibi statik hata olmasa bile, sorgu yürütülürken hatalar döndürebilir.
Statik Bağlam
Statik bağlam başlatma, ifadenin statik analizi için tüm bilgilerin bir araya getirilmesi sürecini ifade eder. Statik bağlam başlatma sürecinin bir parçası olarak aşağıdakiler tamamlanır:
Sınır beyaz alan politikası tamamen soyulacak. Bu nedenle, sınır boşluk sorgudaki herhangi bir eleman ve öznitelik yapıcıları tarafından korunmaz. Örneğin:
declare @x xml set @x='' select @x.query('<a> {"Hello"} </a>, <b> {"Hello2"} </b>')Bu sorgu, XQuery ifadesinin ayrıştırılması sırasında sınır uzayının ortadan kaldırılması nedeniyle aşağıdaki sonucu verir:
<a>Hello</a><b>Hello2</b>Ön ek ve isim alanı bağlaması aşağıdaki için başlatılır:
Önceden tanımlanmış bir isim alanı kümesi.
WITH XMLNAMESPACES kullanılarak tanımlanan herhangi bir isim alanı. Daha fazla bilgi için, bkz. Add Namespaces with XMLNAMESPACES).
Sorgu prologunda tanımlanan herhangi bir isim uzayı. Prologdaki namespace bildirmelerinin, WITH XMLNAMESPACES'teki namespace bildirmesini geçersiz kılabileceğini unutmayın. Örneğin, aşağıdaki sorguda, WITH XMLNAMESPACES bir preek (pd) bildirir ve bu preek onu namespace (
https://someURI) ile bağlar. Ancak, WHERE maddesinde, sorgu prologu bağlamayı geçersiz kılar.WITH XMLNAMESPACES ('https://someURI' AS pd) SELECT ProductModelID, CatalogDescription.query(' <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
Tüm bu isim alanı bağlamaları, statik bağlam başlatma sırasında çözülür.
Tiplenmiş bir xml sütunu veya değişkeni sorgularsa, sütun veya değişkenle ilişkili XML şema koleksiyonunun bileşenleri statik bağlama aktarılır. Daha fazla bilgi için bkz. Yazılan XML'i Yazılmamış XML ile Karşılaştırma.
İthal edilen şemalarda her atom tipi için, statik bağlamda bir döküm fonksiyonu da kullanılabilir. Bu, aşağıdaki örnekte gösterilmiştir. Bu örnekte, bir sorgu tipli bir xml değişkenine karşı belirtilir. Bu değişkenle ilişkili XML şema koleksiyonu, myType adlı atomik bir türü tanımlar. Bu tipe karşılık olarak, statik analiz sırasında myType() adlı bir döküm fonksiyonu mevcuttur. Sorgu ifadesi (
ns:myType(0)) myType değerini döndürür.-- DROP XML SCHEMA COLLECTION SC -- go CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS" xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes"> <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/> <simpleType name="myType"> <restriction base="int"> <enumeration value="0" /> <enumeration value="1"/> </restriction> </simpleType> <element name="root" type="ns:myType"/> </schema>' go DECLARE @var XML(SC) SET @var = '<root xmlns="myNS">0</root>' -- specify myType() casting function in the query SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')Aşağıdaki örnekte, int yerleşik XML tipi için döküm fonksiyonu ifadede belirtilmiştir.
declare @x xml set @x = '' select @x.query('xs:int(5)') go
Statik bağlam başlatıldıktan sonra, sorgu ifadesi analiz edilir (derlenir). Statik analiz şunları içerir:
Sorgu ayrıştırma.
İfadede belirtilen fonksiyon ve tip adlarını çözmek.
Sorgu statik olarak yazıldı. Bu, sorgunun tip açısından güvenli olmasını sağlar. Örneğin, aşağıdaki sorgu statik bir hata döndürür, çünkü operatör + sayısal ilkel tür argümanlar gerektirir:
declare @x xml set @x='' SELECT @x.query('"x" + 4')Aşağıdaki örnekte, value() operatörü bir tekli ton gerektirir. XML şemasında belirtildiği gibi, birden fazla <Elem> öğesi olabilir. İfadenin statik analizi, tip açısından güvenli olmadığını belirler ve statik bir hata döner. Hatayı çözmek için, ifade açıkça bir tekli (
data(/x:Elem)[1]) belirtecek şekilde yeniden yazılmalıdır.DROP XML SCHEMA COLLECTION SC go CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS" xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes"> <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/> <element name="Elem" type="string"/> </schema>' go declare @x xml (SC) set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>' SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')Daha fazla bilgi için bkz. XQuery ve Statik Yazma.
Uygulama Kısıtlamaları
Statik bağlamla ilgili sınırlamalar şunlardır:
XPath uyumluluk modu desteklenmiyor.
XML yapım için yalnızca şerit yapım modu desteklenir. Bu varsayılan ayardır. Bu nedenle, oluşturulmuş eleman düğümünün tipi xdt:untyped tipindendir ve öznitelikler xdt:untypedAtomic tipindendir.
Sadece sıralı sipariş modu desteklenir.
Sadece strip XML alan politikası desteklenir.
Temel URI işlevselliği desteklenmiyor.
fn:doc() desteklenmiyor.
fn:collection() desteklenmiyor.
XQuery statik bayraklayıcı sunulmamaktadır.
xml veri tipiyle ilişkili derleme kullanılır. Bu derleme her zaman Unicode kod noktası derlemesine ayarlanır.
Dinamik Bağlam
Dinamik bağlam, ifadenin yürütüldiği anda mevcut olması gereken bilgiyi ifade eder. Statik bağlama ek olarak, aşağıdaki bilgiler dinamik bağlamın bir parçası olarak başlatılır:
Bağlam öğesi, bağlam konumu ve bağlam boyutu gibi ifade odakları, aşağıdaki gibi başlatılır. Tüm bu değerlerin nodes() yöntemiyle geçersiz kılabileceğini unutmayın.
XML veri türü, işlenen düğüm olan bağlam öğesini belge düğümüne ayar.
Bağlam konumu, yani bağlam öğesinin işlenen düğümlere göre konumu, önce 1 olarak ayarlanır.
Bağlam boyutu, yani işlenilen dizide bulunan öğe sayısı, önce 1'e ayarlanır, çünkü her zaman bir belge düğümü vardır.
Uygulama Kısıtlamaları
Dinamik bağlamla ilgili sınırlamalar şunlardır:
Güncel tarih ve zaman bağlam fonksiyonları, fn:current-date, fn:current-time ve fn:current-dateTime desteklenmez.
İmplicit saat dilimi UTC+0 olarak sabittir ve değiştirilemez.
fn:doc() fonksiyonu desteklenmiyor. Tüm sorgular xml tipi sütunlar veya değişkenler üzerinde yürütülür.
fn:collection() fonksiyonu desteklenmemektedir.