Udostępnij za pośrednictwem


XQuery i wpisując statyczne

XQuery w SQL Server jest język statycznymi.Oznacza to, że niemożliwe błędów typu podczas kompilacji kwerendy gdy wyrażenie zwraca wartość, która ma typ lub Kardynalność nie jest akceptowane przez konkretną funkcja lub operator.Ponadto, kontrola typów statyczne można także wykrywać jeśli błędnie wpisana wyrażenie ścieżka na pismo dokumentu XML.Kompilator XQuery najpierw stosuje fazy normalizacji dodaje niejawne operacje, takie jak Atomizacja, a następnie wykonuje wnioskowanie statycznych i kontrola typów statycznego.

Wnioskowanie typu statycznego

Wnioskowanie statycznych określa typ zwracany wyrażenie.Określa on to statyczne typy parametrów wejściowych i statycznych semantyka operacji i mający wpływ statyczne typu wyniku.Na przykład statyczny typu wyrażenie 1 + 2.3 jest określana w następujący sposób:

  • Statyczne typu 1 jest xs:integer i statycznych 2.3 jest xs:decimal.Oparte semantyka dynamiczne, statyczne semantyka + operacji konwertuje całkowitej dziesiętne, a następnie zwraca ułamek dziesiętny.Inferred typ statyczny będzie wówczas xs:decimal.

Bez wystąpień XML istnieją specjalne typy oznacza, że dane nie została wpisana.Te informacje są używane podczas kontrola typów statycznych i do wykonywania niektórych niejawna poświaty).

W przypadku danych wpisywanych Typ wejściowy jest wywnioskować z kolekcja schematu XML, który ogranicza wystąpienie typu danych XML.Na przykład schemat umożliwia tylko elementy typu xs:integer, wyniki wyrażenie ścieżka za pomocą elementu będą zero lub więcej elementów tego typu xs:integer.Obecnie jest to wyrażona za pomocą wyrażenie, takich jak element(age,xs:integer)* gdzie gwiazdki (*) wskazuje Kardynalność typu Wynikowe.W tym przykładzie wyrażenie może skutkować zero lub więcej elementów nazwę "Wiek" i typ xs:integer.Inne cardinalities są dokładnie jeden i są wyrażone za pomocą nazwy typu samodzielnie zero lub jeden i wyrażona za pomocą znaku zapytania (?) i 1 lub więcej i wyrażona za pomocą znaku plus (+).

Czasami wnioskowanie statycznych mogą wywnioskować wyrażenie będzie zawsze zwraca pusty sekwencji.Na przykład, jeśli wyrażenie ścieżka na wpisany typ danych XML szuka <nazwę> element wewnątrz <klienta> elementu (nazwa/klienta), ale schemat nie zezwala na <nazwę> wewnątrz <klienta>, wnioskowanie statycznych ustali, że wynik będzie pusty.Będzie używana do wykrywać nieprawidłowe kwerend i będą raportowane jako błąd statycznych, chyba że wyrażenie był () lub data( () ).

Wnioskowanie szczegółowe zasady są dostarczane w semantyka formalnej specyfikacji XQuery.Microsoft zmodyfikował te tylko nieznacznie, aby pracować z wpisywanych danych XML typu wystąpienia.Najważniejsze zmiany zgodne ze standardem jest, że węzeł dokument niejawny wie o typie wystąpienie typu danych XML.W wyniku wyrażenie ścieżka /age formularza będzie dokładnie wpisywać na podstawie tej informacji.

Za pomocą Za pomocą SQL Server Profiler, można wyświetlić statyczne typy zwracane jako część kompilacji kwerendy.Aby wyświetlić te, śledzenia musi zawierać XQuery statyczne typ zdarzenie w kategoria zdarzenia TSQL.

Sprawdzanie typu statycznego

Kontrola typów statycznych zapewnia, że uruchomienie -czas wykonanie odbierać tylko wartości, które są odpowiedniego typu operacji.Ponieważ typy nie mają być sprawdzane Uruchom czas, można wykryć potencjalne błędy wczesnym etapie kompilacji.Pomaga zwiększyć wydajność.Jednakże wpisując statyczne wymaga modułu zapisującego kwerendy więcej zachować ostrożność przy formułowaniu kwerendy.

Odpowiednie typy, które mogą być używane są następujące:

  • Typy wyraźnie dozwolone przez funkcja lub operacji.

  • Podtyp typu jawnie dozwolone.

Podtypów są definiowane na podstawie subtyping zasady używania wyprowadzenie ograniczenia lub rozszerzenia schematu XML.Wpisz na przykład typ s jest podtypem T, jeżeli wszystkie wartości, które mają typ s są również wystąpienia typu T.

Ponadto wszystkie wartości całkowitych są również wartości dziesiętnych na podstawie hierarchii typ schematu XML.Jednak nie wszystkie wartości dziesiętne są liczby całkowite.Dlatego liczba całkowita jest podtypem dziesiętne, ale nie odwrotnie.Na przykład + operacji umożliwia tylko wartości niektórych typów, takich jak typy liczbowe xs:integer, xs:decimal, xs:float, i xs:double.Jeśli wartości innych typów, takich jak xs:ciąg, są przekazywane, operacja podnosi błąd typu.To jest nazywane wpisując silne.Wartości innych typów, takie jak typ niepodzielny używane do wskazywania bez typu XML można niejawnie konwertować wartości typu, która akceptuje operacji.To jest nazywane wpisując słabe.

Jeśli jest wymagana po konwersji niejawnych, kontrola typów statycznych gwarantuje przekazywane tylko wartości dozwolone typy z poprawną Kardynalność do operacji."Ciąg" + 1, rozpoznaje, statyczne typu "ciąg" jest xs:ciąg.Ponieważ nie jest dozwolony typ dla + spowodował błąd typu operacji.

W przypadek Dodawanie wynik dowolnego wyrażenie E1 do dowolnego wyrażenie E2 (E1 + E2), najpierw określa typy statycznej E1 i E2 wnioskowanie statycznych, a następnie, czy ich typy statycznej typy dozwolonych dla operacji.Na przykład, jeśli typ statyczny E1 mogą być xs:ciąg lub xs:integer, wyboru typu statycznego podnosi błąd typu, nawet jeśli niektóre wartości przy uruchomieniu czas może być liczbami całkowitymi.Tym samym byłoby przypadek , gdyby statyczne typu E1 xs:integer*.Ponieważ + operacji akceptuje tylko dokładnie jeden całkowitą i E1 może zwrócić zero lub więcej niż 1 wyboru typu statycznego zgłasza błąd.

Jak wspomniano wcześniej, wnioskowanie typu często ustala typ, który jest szerszy niż użytkownik wie o typie danych, który jest przekazywany.W takich przypadkach użytkownik ma od nowa napisać kwerendę.Czasami typowe obejmują:

  • Typ ustala bardziej ogólne typu, takiego jak Nadtyp lub Unii typów.Jeśli typem jest typ niepodzielny, należy użyć funkcja wyrażenie lub konstruktora oddanych do wskazania rzeczywistego typu statycznego.Na przykład, jeśli inferred typu wyrażenie E1 jest wybór między xs:ciąg lub xs:integer i dodanie wymaga xs:integer, należy wpisać xs:integer(E1) + E2 zamiast E1+E2.To wyrażenie może się nie powieść przy uruchomieniu czas Jeśli napotkała wartość ciąg, nie można rzutować na xs:integer.Jednak wyrażenie obecnie przekazywane wyboru typu statycznego.Począwszy od SQL Server 2005, wyrażenie to jest mapowany na pusty sekwencji.

  • Typ ustala Kardynalność wyższe, niż co dane rzeczywiście zawiera.Występuje to często, xml typ danych może zawierać więcej niż jeden element najwyższego poziom i kolekcja schematu XML nie można ograniczyć to.W celu zmniejszenia statyczne typu i zagwarantować, że jest rzeczywiście co najwyżej jedną wartość przekazywanych należy używać pozycyjne predykatu [1].Na przykład, aby dodać 1 do wartości atrybut c elementu b zgodnie z góry -poziom element, należy write (/a/b/@c)[1]+1.Ponadto można słowa kluczowego dokumentu wraz z kolekcja schematu XML.

  • Niektóre operacje utratę informacji o typie podczas wnioskowanie.Na przykład, jeśli nie można ustalić typu węzła, staje się anyType.To jest nie niejawnie oddanych do innego typu.Konwersje te występują głównie podczas nawigacji za pomocą oś nadrzędna.Należy unikać takich działań i nowa napisać kwerendę, jeśli wyrażenie utworzy błąd typu statycznego.

Typ sprawdzania typów Unii

Typy Unii wymagają starannym posługiwaniu ze względu na kontrola typów.Dwa problemy zostały przedstawione w poniższych przykładach.

Przykład: Funkcja nad typu

Należy wziąć pod uwagę definicję elementu <r> typu Unii:

<xs:element name="r">
<xs:simpleType>
   <xs:union memberTypes="xs:int xs:float xs:double"/>
</xs:simpleType>
</xs:element>

W kontekście XQuery, "Średni" Funkcja fn:avg (//r) zwraca błąd statyczne, ponieważ kompilator XQuery nie można dodać wartości różnych typów (xs:int, xs:float lub xs:double) dla <r> elementów w argumencie fn:avg().Aby rozwiązać ten problem, ponownie napisać wywołania funkcja jako fn:avg(for $r in //r return $r cast as xs:double ?).

Przykład: Operator nad typu

Operacja dodawania ("+") wymaga dokładnych typów operandów.Jako wynik wyrażenie (//r)[1] + 1 zwraca błąd statycznych, ma definicji typu opisanej dla elementu <r>.Jedynym rozwiązaniem jest ponownie zapisać go jako (//r)[1] cast as xs:int? +1, gdzie "?" Wskazuje wystąpienia 0 lub 1.Począwszy od SQL Server 2005, SQL Server wymaga "oddane jako" z "?", ponieważ wszelkie rzutowania może spowodować pusty sekwencji z run -czas błędy.