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
Poniższy diagram specyfikacji W3C XQuery 1.0 i XPath 2.0 Functions and Operators przedstawia wbudowane typy danych. Obejmuje to wbudowane typy prymitywne i wbudowane pochodne.
Ten temat opisuje zasady odlewania typów stosowane przy przelewaniu z jednego typu na drugi, stosując jedną z następujących metod:
Jawne castowanie, które wykonujesz za pomocą funkcji cast as lub konstruktora typów (na przykład
xs:integer("5")).Ukryte rzucanie podczas promocji typów
Obsada w formie jawnej
Poniższa tabela przedstawia dozwolone odlewanie czcionek pomiędzy wbudowanymi typami prymitywnymi.
Wbudowany typ prymitywny może przenosić się na inny wbudowany typ prymitywny, na podstawie reguł w tabeli.
Typ prymitywny można odlewać na dowolny typ wyprowadzony z tego typu prymitywnego. Na przykład możesz rzucać z xs:decimal do xs:integer, albo z xs:decimal do xs:long.
Typ pochodny może być przypisany do dowolnego typu, który jest jego przodkiem w hierarchii typów, aż do wbudowanego pierwotnego typu bazowego. Na przykład możesz rzucać z xs:token na xs:normalizedString lub na xs:string.
Typ pochodny można odrzucić do typu prymitywnego, jeśli jego prymitywny przodek można odrzucić na typ docelowy. Na przykład możesz odtworzyć xs:integer, typ pochodny, na xs:string, typ prymitywny, ponieważ xs:decimal, prymitywny przodek xs:integer, można rzucić na xs:string.
Typ pochodny można przypisać do innego typu pochodnego, jeśli prymitywny przodek tego typu źródłowego można przypisać prymitywnemu przodkowi typu docelowego. Na przykład możesz rzucać z xs:integer do xs:token, ponieważ możesz rzucać z xs:decimal do xs:string.
Zasady przesyłania typów zdefiniowanych przez użytkownika do typów wbudowanych są takie same jak dla typów wbudowanych. Na przykład możesz zdefiniować typ myInteger pochodzący z xs:integer type. Wtedy myInteger można obracać na xs:token, ponieważ xs:decimal można zarzucać na xs:string.
Następujące rodzaje odlewów nie są obsługiwane:
Rzucanie na lub z typów list nie jest dozwolone. Obejmuje to zarówno typy list zdefiniowane przez użytkownika, jak i wbudowane typy list, takie jak xs:IDREFs, xs:ENTITIES i xs:NMTOKENS.
Przesyłanie do lub z xs:QName nie jest obsługiwane.
xs:NOTATION oraz w pełni uporządkowane podtypy duration, xdt:yearMonthDuration oraz xdt:dayTimeDuration, nie są obsługiwane. W rezultacie nie obsługiwane jest rzucanie do lub z tych typów.
Poniższe przykłady ilustrują odlewanie czcionek jawnych.
Przykład A
Poniższy przykład zapytuje zmienną typu xml. Zapytanie zwraca ciąg prostej wartości typu oznaczoną jako xs:string.
declare @x xml
set @x = '<e>1</e><e>2</e>'
select @x.query('/e[1] cast as xs:string?')
go
Przykład B
Poniższy przykład zapytuje wpisaną zmienną xml. Przykład najpierw tworzy kolekcję schematów XML. Następnie wykorzystuje kolekcję schematów XML do stworzenia typowanej zmiennej xml. Schemat dostarcza informacji o typowaniu dla instancji XML przypisanej do tej zmiennej. Następnie zapytania są określane względem tej zmiennej.
create xml schema collection myCollection as N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="xs:string"/>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
go
Następujące zapytanie zwraca statyczny błąd, ponieważ nie wiesz, ile elementów najwyższego poziomu <root> znajduje się w instancji dokumentu.
declare @x xml(myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</baz></C>'
select @x.query('/root/A cast as xs:string?')
go
Poprzez określenie elementu singleton <root> w wyrażeniu, zapytanie kończy się sukcesem. Zapytanie zwraca ciąg prostej wartości typu oznaczoną jako xs:string.
declare @x xml(myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</C></root>'
select @x.query('/root[1]/A cast as xs:string?')
go
W poniższym przykładzie zmienna typu xml zawiera słowo kluczowe w dokumentze, które określa kolekcję schematów XML. Oznacza to, że instancja XML musi być dokumentem zawierającym pojedynczy element poziomu najwyższego. Jeśli utworzysz dwa <root> elementy w instancji XML, zwróci ona błąd.
declare @x xml(document myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</C></root>'
go
Możesz zmienić instancję, aby zawierała tylko jeden element najwyższego poziomu i zapytanie działa. Ponownie zapytanie zwraca ciąg prostej wartości typu oznaczoną jako xs:string.
declare @x xml(document myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>'
select @x.query('/root/A cast as xs:string?')
go
Implicitne obsadzenie
Implicit casting jest dozwolony tylko dla typów numerycznych i nietypowanych typów atomowych. Na przykład następująca funkcja min() zwraca minimum z dwóch wartości:
min(xs:integer("1"), xs:double("1.1"))
W tym przykładzie dwie wartości przekazane do funkcji XQuery min() są różnych typów. Dlatego przeprowadza się konwersję niejawną, gdzie typ liczby całkowitej jest promowany do podwójnego i porównywane są dwie wartości podwójne .
Promocja typu, opisana w tym przykładzie, opiera się na następujących zasadach:
Wbudowany pochodny typ numeryczny może być awansowany do swojego podstawowego typu. Na przykład liczba całkowita może być awansowana do dziesiętna.
Dziesiętny może zostać awansowany do float, a float do double.
Ponieważ implicitne casting jest dozwolone tylko dla typów liczbowych, następujące zasady nie są dozwolone:
Niejawne odlewanie dla typów strun jest zabronione. Na przykład, jeśli oczekiwane są dwa typy ciągów znaków i przekażesz łańcuch oraz token, nie występuje żadne ukryte castowanie i zwracany jest błąd.
Niejawne rzucanie z typów liczbowych na typy ciągów znaków jest zabronione. Na przykład, jeśli przekażesz wartość typu całkowitego do funkcji, która oczekuje parametru typu string, nie występuje żadne niejawne castowanie i zwracany jest błąd.
Wartości odlewu
Podczas przelewania z jednego typu na drugi, rzeczywiste wartości są przekształcane z przestrzeni wartości typu źródłowego do przestrzeni wartości typu docelowego. Na przykład, odlewanie z xs:dziesiętnego na xs:double przekształca wartość dziesiętną w podwójną.
Poniżej przedstawiono niektóre z reguł transformacji.
Odrzucanie wartości z typu string lub untypdAtomic
Wartość rzucana na ciąg lub typ nietypowanyAtomic jest transformowana w taki sam sposób, jak weryfikacja wartości na podstawie reguł typu docelowego. Obejmuje to reguły przetwarzania wzorców i odstępów końcowych. Na przykład następująca metoda się sprawdzi i wygeneruje podwójną wartość, 1.1e0:
xs:double("1.1")
Podczas przesyłania do typów binarnych, takich jak xs:base64Binary lub xs:hexBinary, z ciągu lub typu untypdAtomic, wartości wejściowe muszą być odpowiednio zakodowane base64 lub hex.
Przypisanie wartości do struny lub typu nietypowanego Atomic
Rzutowanie do typu stringowego lub nietypowanego Atomic przekształca wartość w jego XQuery, kanoniczną reprezentację leksykalną. Konkretnie, może to oznaczać, że wartość, która mogła spełniać określony wzorzec lub inne ograniczenie podczas wejścia, nie zostanie przedstawiona zgodnie z tym ograniczeniem. Aby poinformować użytkowników o tym, SQL Server oznacza typy, w których ograniczenie typu może stanowić problem, wyświetlając ostrzeżenie, gdy te typy zostaną załadowane do kolekcji schematów.
Podczas odlewania wartości typu xs:float lub xs:double, albo dowolnego z ich podtypów, na ciąg lub typ untypedAtomic, wartość ta jest reprezentowana w notacji naukowej. Dzieje się to tylko wtedy, gdy wartość bezwzględna wartości jest mniejsza niż 1,0E-6 lub większa lub równa 1,0E6. Oznacza to, że 0 jest serializowane w notacji naukowej do 0.0E0.
Na przykład zwróci xs:string(1.11e1) wartość "11.1"ciągu , natomiast xs:string(-0.00000000002e0) zwróci wartość "-2.0E-11"ciągu , .
Podczas przelewania typów binarnych, takich jak xs:base64Binary lub xs:hexBinary, na typ ciągowy lub nietypowy, wartości binarne będą reprezentowane odpowiednio w formie zakodowanej w base64 lub hex kodowanej.
Rzucanie wartości do typu numerycznego
Podczas przelewania wartości jednego typu numerycznego na wartość innego typu numerycznego, wartość ta jest odwzorowana z jednej przestrzeni wartości do drugiej bez przechodzenia przez serializację ciągów znaków. Jeśli wartość nie spełnia ograniczenia typu docelowego, obowiązują następujące zasady:
Jeśli wartość źródłowa jest już numeryczna, a typ docelowy to xs:float lub jego podtyp umożliwiający wartości -INF lub INF, a obsadzenie wartości liczbowej źródłowej skutkowałoby przepełnieniem, wartość jest mapowana na INF, jeśli wartość jest dodatnia, lub -INF, jeśli wartość ujemna. Jeśli typ docelowy nie pozwala na INF lub -INF i wystąpi przepełnienie, przelew się nie udaje i w tej wersji SQL Server wyniknie pusta sekwencja.
Jeśli wartość źródłowa jest już numeryczna, a typ docelowy to typ liczbowy, który zawiera 0, -0e0 lub 0e0 w akceptowanym zakresie wartości, a odlewanie wartości źródłowej spowoduje underflow, wartość jest mapowana w następujący sposób:
Wartość ta jest przypisana do 0 dla typu celu dziesiętnego.
Wartość jest odwzorowana na -0e0, gdy jest to ujemny podpłyn.
Wartość jest odwzorowana na 0e0, gdy jest dodatnim podpłynieniem dla typu typu float lub double.
Jeśli typ celu nie zawiera zera w swojej przestrzeni wartości, rzut się nie udaje i wynik to pusta sekwencja.
Należy zauważyć, że przypisanie wartości binarnemu typu zmiennoprzecinkowego, takiego jak xs:float, xs:double lub któremukolwiek z ich podtypów, może stracić precyzję.
Ograniczenia implementacji
Są to ograniczenia:
Wartość zmiennoprzecinkowa NaN nie jest obsługiwana.
Wartości castowalne są ograniczone przez ograniczenia implementacyjne typu target. Na przykład nie można rzucić ciągu daty o ujemnym roku na xs:date. Takie przerzuty skutkują pustą sekwencją, jeśli wartość jest podana w czasie działania (zamiast powodować błąd w czasie wykonywania).