Kontekst wyrażenie i oceny Query (XQuery)
Kontekst wyrażenie są informacje, które jest używane do analizowania i ocenić je.Poniżej przedstawiono dwa etapy, w której jest obliczane XQuery:
Kontekst statyczne — Jest to faza kompilacji kwerendy.W zależności od dostępnych informacji błędów są czasami uruchamiany podczas tej analizy statyczne kwerendy.
Dynamiczne kontekstu — Jest to faza wykonania kwerendy.Nawet jeśli kwerendy nie zawiera statycznej błędów, takie jak błędy podczas kompilacji kwerendy kwerendy mogą zwracać błędy podczas jej wykonywania.
Kontekst statyczne
Inicjalizacja kontekstu statycznych odnosi się do procesu składanie razem wszystkie informacje do statycznej analizy wyrażenie.W ramach inicjalizacji kontekstu statycznych poniżej jest wykonywane:
The boundary white space policy is zestaw to strip.Dlatego granicę białe miejsca nie jest zachowywana przez any element i attribute Konstruktorzy w kwerendzie. Na przykład:
declare @x xml set @x='' select @x.query('<a> {"Hello"} </a>, <b> {"Hello2"} </b>')
Ponieważ granice obszaru jest poza biurem usunięte podczas analizowania składni wyrażenie XQuery, ta kwerenda zwraca następujące wyniki:
<a>Hello</a><b>Hello2</b>
Prefiks i wiązania obszaru nazw są inicjowane dla następujących elementów:
Zestaw wstępnie zdefiniowanych obszarów nazw.
Wszystkie obszary nazw zdefiniowane przy użyciu XMLNAMESPACES WITH.Aby uzyskać więcej informacji zobacz Dodawanie obszarów nazw przy użyciu WITH XMLNAMESPACES).
Wszystkie obszary nazw zdefiniowane w prologu kwerendy.Należy zauważyć, że deklaracji obszaru nazw w prologu mogą zastąpić deklaracja obszaru nazw w XMLNAMESPACES WITH.Na przykład poniższa kwerenda WITH XMLNAMESPACES deklaruje prefiks (pd), która wiąże go do obszaru nazw (http://someURI).W klauzula WHERE kwerendy prologu zastępuje wiązanie.
WITH XMLNAMESPACES ('http://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 powiązania nazw są rozpoznawane podczas inicjalizacji kontekstu statycznego.
Jeśli podczas badania maszynowy xml kolumna lub zmienna, składniki kolekcja schematu XML, które są skojarzone z kolumna lub zmiennej są importowane do kontekstu statycznego. Aby uzyskać więcej informacji zobaczTyped XML Compared to Untyped XML.
Dla każdego typu niepodzielny w schematach importowanych funkcja rzutowanie jest również dostępne w kontekście statyczne.Jest to zilustrowane w poniższym przykładzie.W tym przykładzie określono kwerendy przed maszynowy xml Zmienna. kolekcja schematu XML, skojarzonego ze zmienną ta definiuje typ niepodzielny, myType.Odpowiadający tego typu, funkcją rzutowania myType(), jest dostępna w trakcie analizy statyczne. (Wyrażenie kwerendyns: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 rzutowania dla int wbudowany typ XML jest określona w wyrażenie.
declare @x xml set @x = '' select @x.query('xs:int(5)') go
Po zainicjowaniu jest kontekstu statycznych, kwerendy wyrażenie jest analizowany (skompilowany).Do statycznej analizy wiąże się z następujących czynności:
Podczas analizy kwerendy.
Rozpoznawanie nazwy funkcja i typ określony w wyrażeniu.
Wpisywanie statyczne kwerendy.Dzięki temu upewnić się, że kwerenda jest typu bezpieczne.Na przykład, poniższa kwerenda zwraca błąd statycznych, ponieważ + operator wymaga argumentów numerycznych podstawowego typu:
declare @x xml set @x='' SELECT @x.query('"x" + 4')
W poniższym przykładzie value() operator wymaga pojedyncza. Jak określono w schemacie XML może istnieć wiele <Element> elementy. Statyczne analizy wyrażenie określa, czy nie jest typu bezpieczne i zwracany jest błąd statyczne.Ponownie zapisywane, tak aby usunąć błąd, wyrażenie musi być aby przechowywały jawnie określić (pojedynczadata(/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 zobaczXQuery i wpisywania statyczne.
Ograniczenia dotyczące implementacji
Ograniczenia związane z kontekstu statycznego są następujące:
Tryb zgodności XPath nie jest obsługiwana.
Konstrukcji XML obsługiwane są tylko tryb budowy taśmy.Jest to ustawienie domyślne.Dlatego typ węzła zbudowane elementu jest xdt:untyped Typ i atrybuty są xdt:untypedAtomic Typ.
Tylko tryb zamawiania zamówione jest obsługiwany.
Obsługiwany jest tylko pasek zasady XML miejsca.
Podstawowe funkcje identyfikator URI nie jest obsługiwana.
fn:doc() nie jest obsługiwana.
fn:collection() nie jest obsługiwana.
Nie podano XQuery flagger statyczne.
Sortowanie, skojarzone z xml Typ danych jest używany. To sortowanie jest zawsze zestaw do sortowanie codepoint Unicode.
Kontekst dynamiczne
Informacje, które muszą być dostępne w czasie wyrażenie odwołuje się kontekstu dynamicznego.W uzupełnieniu do kontekstu statycznego jako część kontekstu dynamicznego inicjowania następujące informacje:
Fokus wyrażenie, takie jak element kontekstu kontekstu pozycji i rozmiaru kontekstu jest inicjowana, jak pokazano w poniższym.Należy zauważyć, że wartości te mogą być zastępowane przez Metoda nodes().
The xml data type sets the context element, the node being processed, to the document node.
Położenie kontekstu pozycji element kontekstu względem węzły przetwarzania, po raz pierwszy zestaw na 1.
Rozmiar kontekstu, liczba elementów w kolejności, w trakcie przetwarzania, najpierw jest ustawiony na 1, ponieważ jest zawsze jeden węzeł dokumentu.
Ograniczenia dotyczące implementacji
Ograniczenia związane z kontekstu dynamicznego są następujące:
The Current data and czas context functions, fn:current-date, fn:current-time, and fn:current-dateTime, are not supported.
The implicit timezone is fixed to UTC+0 and cannot be changed.
The fn:doc() funkcja is not supported. Wszystkie kwerendy są wykonywane przed xml Typ kolumny lub zmienne.
The fn:collection() funkcja is not supported.
See Also