Udostępnij za pośrednictwem


XQuery i wpisywania statyczne

XQuery w SQL Server jest to język statycznie pisma. Oznacza to niemożliwe typu błędów podczas kompilacji kwerendy, gdy wyrażenie zwraca wartość, która ma typ lub relacja nie jest akceptowane przez określonej funkcja lub operator.Ponadto kontrola typów statycznych może także wykryć jeśli błędnie wyrażenie ścieżka do określonego dokumentu XML.Kompilator XQuery najpierw stosuje się w fazie normalizacji dodaje niejawne operacje, takie jak Atomizacja, a następnie wykonuje wnioskowanie typu statycznego i kontrola typów statycznego.

Wnioskowanie tekst statyczny

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

  • Jest statyczny typ 1 xs:Integer jest i statycznych typu 2.3xs:decimal.Oparte na dynamiczne semantykę statyczne semantyka + operacji konwertuje wartości całkowitej ułamek dziesiętny, a następnie zwraca ułamek dziesiętny.Będzie wówczas inferred typu statycznego xs:decimal.

W przypadku wystąpienia bez typu XML istnieją specjalnego typu, aby wskazać, że dane nie została wpisana.Te informacje są używane podczas kontrola typów statycznego i do wykonywania niektórych niejawna poświaty).

W przypadku danych wpisywanych Typ wejściowy jest wywnioskować z kolekcja schematu XML, która ogranicza wystąpienie typu danych XML.Na przykład, jeśli schemat umożliwia tylko elementy typu xs:Integerjest zero lub więcej elementów typu , wyniki wyrażenie ścieżka przy użyciu tego elementuxs:Integer.Obecnie jest to wyrażona za pomocą wyrażenie, takich jak element(age,xs:integer)* Jeśli gwiazdka ** wskazuje relacja typu Wynikowe. W tym przykładzie wyrażenie może spowodować zero lub więcej elementów nazwy "Wiek" i typu xs:integer. Inne cardinalities są dokładnie jedno i są wyrażone za pomocą samej, nazwy typu zero lub jeden i wyrażona za pomocą (znak zapytania?), a 1 lub więcej i wyrażona za pomocą (znak plus+).

Czasami wnioskowanie typu statycznego można wywnioskować wyrażenie zwróci zawsze puste sekwencji.Na przykład, jeśli wyrażenie ścieżka na określonego typu danych XML szuka <Nazwa> element wewnątrz <odbiorcy> element (Nazwa/odbiorcy /), ale schemat nie zezwala na <Nazwa> wewnątrz <odbiorcy>, wnioskowanie typu statycznego zostanie wywnioskować wynik będzie pusty. Ten będzie używany w celu wykrywać nieprawidłowych kwerendy i będą raportowane jako błąd statycznych, chyba że wyrażenie zostało () lub data( () ).

Reguły szczegółowe wnioskowanie znajdują się w semantyce formalnej specyfikacji XQuery.Microsoft zmodyfikował te tylko nieznacznie do pracy z danymi XML wpisywanych wystąpienia typu.Najważniejsze zmiany ze standardu jest wie, że węzeł domyślny dokument o typie wystąpienie typu danych XML.W rezultacie wyrażenie ścieżka z /age formularza będzie można dokładnie wpisane na podstawie tej informacji.

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

kontrola typów statycznego

kontrola typów statycznego zapewnia, że uruchomienie-czas wykonanie będą otrzymywać tylko wartości, które są odpowiedni typ dla tej operacji.Ponieważ typów nie jest sprawdzana przy uruchomieniu czas, potencjalnych błędów mogą zostać wykryte na początku kompilacji.Pomaga to poprawić wydajność.Jednak wpisując statyczne wymaga modułu zapisującego kwerendy więcej zachować ostrożność podczas tworzenia kwerendy.

Odpowiednich typów, które mogą być używane są następujące:

  • Typy wyraźnie dozwolone przez funkcja lub operacji.

  • Podtyp typu wyraźnie dozwolone.

Zdefiniowano podtypów, oparte na subtyping zasady za pomocą wyprowadzenie według ograniczenia lub rozszerzenia schematu XML.Wpisz na przykład typ, podtyp jest S 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ętne, na podstawie hierarchii typ schematu XML.Jednak nie wszystkie wartości dziesiętne są liczby całkowite.W związku z tym liczbą całkowitą, jest podtypem miejsc po przecinku, ale nie odwrotnie.Na przykład + operacji umożliwia tylko wartości określonych typów, takich jak liczbowych typów xs:Integer, xs:decimal, xs:float, and xs:Double.Jeśli wartości innych typów, takich jak xs:ciąg, są przekazywane, operacja wywołuje błąd typu.To odnosi się do wpisywania silne.Wartości z innych typów, takie jak typ niepodzielny używane do wskazywania bez typu XML można niejawnie przekonwertować wartości typu, która akceptuje operacji.To odnosi się do wpisywania słabe.

W razie potrzeby po niejawna konwersja, kontrola typów statycznego gwarantuje przekazywane tylko wartości dozwolonych typów, z poprawną relacja operacji."Ciąg" + 1 rozpoznaje czy jest statyczny typu "ciąg" xs:String.Ponieważ nie jest typem dozwolonych dla + operacji, błąd typu jest uruchamiany.

przypadek braku dodawania wyników dowolnego wyrażenie E1 do arbitralnego wyrażenie E2 (E1 + E2), wnioskowanie typu statycznego najpierw określa typy statycznej E1 i E2, a następnie, czy ich typów static typy dozwolonych dla tej operacji.Na przykład, jeśli typ statyczny E1 mogą być xs:ciąg or an xs:Integer, wyboru typu statycznego wywołuje błąd typu, nawet jeśli niektóre wartości przy uruchomieniu czas mogą być liczbami całkowitymi.przypadek takie same byłoby, gdyby statyczne typu E1 xs:Integer*.Ponieważ + operacji akceptuje tylko dokładnie jednej wartości całkowitej i E1 może zwrócić zero lub więcej niż 1 wyboru typu statycznego zgłasza błąd.

Jak wspomniano wcześniej, typ wnioskowanie często ustala typ, który jest szerszy niż użytkownik wie o typie danych, który jest przekazywany.W takim przypadku użytkownik będzie musiał od nowa napisać kwerendę.Czasami typowe należą:

  • Typ ustala typ bardziej ogólne, na przykład Nadtyp lub związek z typów.Jeśli jest to typ niepodzielny, należy użyć funkcja wyrażenie lub konstruktora rzutowania, aby wskazać rzeczywistą typu statycznego.Na przykład, jeśli inferred typ wyrażenie E1 jest wybór pomiędzy xs:ciąg or xs:Integer wymaga i dodaniexs:Integer, należy wpisać xs:integer(E1) + E2 zamiast E1+E2. To wyrażenie może się nie powieść w czasie wykonywania, jeśli wartość ciąg zostanie osiągnięty, nie można rzutować na xs:Integer.Jednak wyrażenie będzie teraz przekazywać wyboru typu statycznego.Zaczyna się od SQL Server 2005, wyrażenie to jest mapowany na pusty sekwencji.

  • Typ ustala wyższe liczebność niż co dane rzeczywiście zawiera.Zdarza się to często, ponieważ XML typu danych może zawierać więcej niż jeden element najwyższego poziom i kolekcja schematu XML nie może ograniczyć to.W celu zmniejszenia typu statycznego i zagwarantować, że jest w rzeczywistości co najwyżej jedną wartość przesłaniem należy używać predykat pozycyjne [1]. Na przykład, aby dodać 1 do wartości atrybut c elementu b na najwyższym poziomie elementu, należy write (/a/b/@c)[1]+1. Ponadto można użyć 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 określić typu węzła, staje się anyType. To jest nie niejawnie rzutować na innego typu.Przy użyciu oś nadrzędna konwersje te występują głównie podczas nawigacji.Należy unikać stosowania takich operacji i nowa napisać kwerendę, jeśli wyrażenie utworzy błąd typu statycznego.

kontrola typów Union typów

Typy Union wymagają obsługi uważać, aby ze względu na kontrola typów.Dwa problemy zostały przedstawione w poniższych przykładach.

Przykład: Funkcja przez typ Union

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

<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 statycznych, ponieważ kompilator XQuery nie można dodać wartości różnych typów)xs:int, xs:float lub xs:double) dla <r> elementy w argumencie fn:avg(). To rozwiązanie, należy ponownie napisać wywołania funkcja jako fn:avg(for $r in //r return $r cast as xs:double ?).

Przykład: Operator przez typ Union

Operacja dodawania ("+") wymaga dokładnego typów operandów.W wyniku wyrażenie (//r)[1] + 1 Zwraca błąd statycznych, definicji typu opisane wcześniej dla elementu <r>. Jednym z rozwiązań jest ponownie zapisać go jako (//r)[1] cast as xs:int? +1, gdzie "?" wskazuje liczbę wystąpień 0 lub 1. Zaczyna się od SQL Server 2005, SQL Serverwymaga "rzutować jako"z"?", ponieważ każdy rzutowania może spowodować, że puste kolejny z powodu błędów czas wykonywania.