Kontext výrazu a vyhodnocení dotazu (XQuery)
platí pro:SQL Server
Kontext výrazu je informace, které se používají k analýze a vyhodnocení. Následují dvě fáze, ve kterých se Vyhodnocuje XQuery:
statický kontext – jedná se o fázi kompilace dotazu. Na základě dostupných informací se během této statické analýzy dotazu někdy generují chyby.
dynamického kontextu – jedná se o fázi provádění dotazu. I když dotaz nemá žádné statické chyby, například chyby během kompilace dotazu, může dotaz během provádění vrátit chyby.
Statický kontext
Inicializace statického kontextu odkazuje na proces sestavení všech informací pro statickou analýzu výrazu. V rámci inicializace statického kontextu se dokončí následující:
Pro prázdné znaky zásady jsou nastavené na pruh. Proto není ohraničení prázdné znaky zachováno žádný prvek a atribut konstruktory v dotazu. Například:
declare @x xml set @x='' select @x.query('<a> {"Hello"} </a>, <b> {"Hello2"} </b>')
Tento dotaz vrátí následující výsledek, protože při parsování výrazu XQuery dojde k odstranění ohraničení prostoru:
<a>Hello</a><b>Hello2</b>
Předpona a vazba oboru názvů jsou inicializovány pro následující:
Sada předdefinovaných oborů názvů.
Všechny obory názvů definované pomocí WITH XMLNAMESPACES. Další informace naleznete v tématu Přidání oborů názvů do dotazů pomocí WITH XMLNAMESPACES).
Všechny obory názvů definované v prologu dotazu. Všimněte si, že deklarace oboru názvů v prologu mohou přepsat deklaraci oboru názvů v WITH XMLNAMESPACES. Například v následujícím dotazu deklaruje funkce WITH XMLNAMESPACES předponu (pd), která ji sváže s oborem názvů (
https://someURI
). V klauzuli WHERE však prolog dotazu přepíše vazbu.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
Všechny tyto vazby oboru názvů jsou vyřešeny během inicializace statického kontextu.
Pokud dotazování zadaného xml sloupci nebo proměnné, importují se do statického kontextu komponenty kolekce schématu XML přidružené ke sloupci nebo proměnné. Další informace naleznete v tématu Porovnání typ XML s nezatypovanými xml.
Pro každý atomický typ v importovaných schématech je v statickém kontextu zpřístupněna také funkce přetypování. To je znázorněno v následujícím příkladu. V tomto příkladu je dotaz určen pro typ xml proměnné. Kolekce schématu XML přidružená k této proměnné definuje atomický typ myType. Odpovídající tomuto typu je funkce přetypování, myType(), k dispozici během statické analýzy. Výraz dotazu (
ns:myType(0)
) vrátí hodnotu myType.-- 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)')
V následujícím příkladu je ve výrazu zadána funkce přetypování pro int integrovaný typ XML.
declare @x xml set @x = '' select @x.query('xs:int(5)') go
Po inicializaci statického kontextu se výraz dotazu analyzuje (kompiluje). Statická analýza zahrnuje následující:
Analýza dotazů
Překlad názvů funkcí a typů zadaných ve výrazu
Statické psaní dotazu Tím zajistíte, že je dotaz bezpečný. Například následující dotaz vrátí statickou chybu, protože operátor + vyžaduje číselné argumenty primitivního typu:
declare @x xml set @x='' SELECT @x.query('"x" + 4')
V následujícím příkladu vyžaduje operátor value() singleton. Jak je uvedeno ve schématu XML, může existovat více <Elem> elementy. Statická analýza výrazu určuje, že není typu bezpečná a vrátí se statická chyba. Pokud chcete chybu vyřešit, musí se výraz přepsat a explicitně zadat singleton (
data(/x:Elem)[1]
).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)')
Další informace naleznete v tématu XQuery a statické psaní.
Omezení implementace
Toto jsou omezení související se statickým kontextem:
Režim kompatibility XPath není podporován.
U konstrukce XML je podporován pouze režim konstrukce pruhu. Toto je výchozí nastavení. Proto typ vytvořeného uzlu elementu je xdt:untyped typ a atributy jsou xdt:untypedAtomic typ.
Podporuje se pouze režim řazení objednávek.
Podporují se pouze zásady pro odstranění prostoru XML.
Základní funkce identifikátoru URI není podporována.
fn:doc() se nepodporuje.
fn:collection() se nepodporuje.
Statický příznak XQuery není k dispozici.
Používá se kolace přidružená k datovému typu xml. Tato kolace je vždy nastavena na kolaci kódu Unicode.
Dynamický kontext
Dynamický kontext odkazuje na informace, které musí být k dispozici v době spuštění výrazu. Kromě statického kontextu se v rámci dynamického kontextu inicializují následující informace:
Fokus výrazu, například kontextová položka, umístění kontextu a velikost kontextu, se inicializuje, jak je znázorněno na následujícím obrázku. Všimněte si, že všechny tyto hodnoty lze přepsat metodou nodes().
Datový typ xml nastaví kontextové položky, zpracování uzlu na uzel dokumentu.
Pozice kontextu, umístění kontextové položky vzhledem ke zpracovávaným uzlům, je nejprve nastaveno na hodnotu 1.
Velikost kontextu, počet položek v pořadí, které se zpracovává, je nejprve nastavena na 1, protože vždy existuje jeden uzel dokumentu.
Omezení implementace
Toto jsou omezení související s dynamickým kontextem:
Kontextové funkce aktuálního data a času, fn:current-date, fn:current-timea fn:current-dateTimenejsou podporované.
Implicitní časové pásmo je pevné na UTC+0 a nedá se změnit.
Funkce fn:doc() není podporovaná. Všechny dotazy se provádějí na xml sloupce nebo proměnné typu.
Funkce fn:collection() se nepodporuje.
Viz také
základy XQuery
porovnání typovaného XML s nezatypovanými XML
kolekce schémat XML (SQL Server)