Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Kontekst wyrażenia to informacja, która służy do jego analizy i oceny. Poniżej przedstawiono dwie fazy, w których oceniane jest XQuery:
Statyczny kontekst – To jest faza kompilacji zapytań. Na podstawie dostępnych informacji, podczas statycznej analizy zapytania czasami pojawiają się błędy.
Dynamiczny kontekst – To jest faza wykonywania zapytań. Nawet jeśli zapytanie nie zawiera błędów statycznych, takich jak błędy podczas kompilacji, zapytanie może zwracać błędy podczas wykonywania.
Statyczny kontekst
Statyczna inicjalizacja kontekstu odnosi się do procesu gromadzenia wszystkich informacji do statycznej analizy wyrażenia. W ramach statycznej inicjalizacji kontekstu realizowane jest następujące etapy:
Polityka dotycząca białych przestrzeni na granicach ma zostać usunięta. Dlatego biała przestrzeń graniczna nie jest zachowywana przez konstruktory żadnego elementu i atrybutu w zapytaniu. Przykład:
declare @x xml set @x='' select @x.query('<a> {"Hello"} </a>, <b> {"Hello2"} </b>')To zapytanie zwraca następujący wynik, ponieważ przestrzeń brzegowa zostaje usunięta podczas parsowania wyrażenia XQuery:
<a>Hello</a><b>Hello2</b>Prefiks i powiązanie przestrzeni nazw są inicjalizowane dla następujących elementów:
Zestaw predefiniowanych przestrzeni nazw.
Dowolne przestrzenie nazw zdefiniowane za pomocą przestrzeni nazw WITH XML. Więcej informacji można znaleźć w artykule Dodaj przestrzenie nazw do zapytań z XML przestrzeniami nazw).
Dowolne przestrzenie nazw zdefiniowane w prologu zapytania. Należy zauważyć, że deklaracje przestrzeni nazw w prologu mogą nadpisać deklarację przestrzeni nazw w przestrzeniach nazw WITH XML. Na przykład w następującym zapytaniu WITH XML namespaces deklaruje prefiks (pd), który wiąże go z przestrzenią nazw (
https://someURI). Jednak w klauzuli WHERE prolog zapytania nadpisuje wiązanie.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
Wszystkie te powiązania w przestrzeniach nazw są rozwiązywane podczas statycznej inicjalizacji kontekstu.
Jeśli zapytasz wpisaną kolumnę lub zmienną xml , komponenty kolekcji schematów XML powiązane z kolumną lub zmienną są importowane do kontekstu statycznego. Aby uzyskać więcej informacji, zobacz Compare Typed XML to Untyped XML.
Dla każdego typu atomowego w importowanych schematach dostępna jest także funkcja odlewania w kontekście statycznym. Przedstawiono to w poniższym przykładzie. W tym przykładzie zapytanie jest określone względem wpisanej zmiennej xml . Kolekcja schematów XML powiązana z tą zmienną definiuje typ atomowy myType. Odpowiadając temu typowi, podczas analizy statycznej dostępna jest funkcja castingu myType(). Wyrażenie zapytania (
ns:myType(0)) zwraca wartość 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)')W poniższym przykładzie funkcja castingu wbudowanego typu XML int jest określona w wyrażeniu.
declare @x xml set @x = '' select @x.query('xs:int(5)') go
Po inicjalizacji statycznego kontekstu wyrażenie zapytania jest analizowane (kompilowane). Analiza statyczna obejmuje następujące kwestie:
Parsowanie zapytań.
Rozwiązywanie nazw funkcji i typów określonych w wyrażeniu.
Statyczne wpisywanie zapytania. To zapewnia, że zapytanie jest bezpieczne dla typu. Na przykład następujące zapytanie zwraca statyczny błąd, ponieważ + operator wymaga numerycznych argumentów typu prymitywnego:
declare @x xml set @x='' SELECT @x.query('"x" + 4')W poniższym przykładzie operator value() wymaga singleton. Jak określono w schemacie XML, może występować wiele <elementów Elem> . Statyczna analiza wyrażenia wskazuje, że nie jest ono typowo bezpieczne i zwracany jest błąd statyczny. Aby rozwiązać błąd, wyrażenie musi zostać przepisane, aby wyraźnie określić 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)')Aby uzyskać więcej informacji, zobacz XQuery i Static Typing.
Ograniczenia implementacji
Poniżej przedstawiono ograniczenia związane ze statycznym kontekstem:
Tryb kompatybilności z XPath nie jest obsługiwany.
Do konstrukcji XML obsługiwany jest tylko tryb konstrukcji z taśmami. Jest to ustawienie domyślne. W związku z tym typ węzła skonstruowanego elementu to typ xdt:untyped , a atrybuty to typ xdt:untypedAtomic .
Obsługiwany jest tylko tryb uporządkowania.
Obsługiwana jest tylko polityka przestrzeni XML.
Funkcjonalność bazowego URI nie jest obsługiwana.
fn:doc() nie jest obsługiwany.
fn:collection() nie jest obsługiwany.
Statyczny flager XQuery nie jest udostępniony.
Używa się zestawu powiązanego z typem danych xml . Ta sortacja jest zawsze ustawiona na kodowy punkt Unicode.
Kontekst dynamiczny
Kontekst dynamiczny odnosi się do informacji, które muszą być dostępne w momencie wykonania wyrażenia. Oprócz kontekstu statycznego, następujące informacje są inicjalizowane jako część kontekstu dynamicznego:
Fokus wyrażenia, taki jak element kontekstu, pozycja kontekstu i rozmiar kontekstu, jest inicjalizowany zgodnie z poniższymi ilustracjami. Należy zauważyć, że wszystkie te wartości można nadpisać metodą nodes().
Typ danych xml ustawia element kontekstu, czyli przetwarzany węzeł, do węzła dokumentu.
Pozycja kontekstowa, czyli pozycja elementu kontekstu względem przetwarzanych węzłów, jest najpierw ustalana na 1.
Rozmiar kontekstu, czyli liczba elementów w przetwarzanej sekwencji, jest najpierw ustalany na 1, ponieważ zawsze istnieje jeden węzeł dokumentu.
Ograniczenia implementacji
Poniżej przedstawiono ograniczenia związane z dynamicznym kontekstem:
Funkcje kontekstu Current date and time , fn:current-date, fn:current-time oraz fn:current-dateTime, nie są obsługiwane.
Strefa czasowa ukryta jest ustalona na UTC+0 i nie może być zmieniona.
Funkcja fn:doc() nie jest obsługiwana. Wszystkie zapytania są wykonywane na kolumnach lub zmiennych typu xml .
Funkcja fn:collection() nie jest obsługiwana.