Typ rzutowania reguły powodujące XQuery
Na poniższym diagramie specyfikacji W3C XQuery 1.0, XPath 2.0 funkcje i operatory zawiera wbudowane typy danych.Dotyczy to również wbudowane pierwotne i wbudowane typy pochodne.
W tym temacie opisano reguły rzutowania typów, które są stosowane, gdy rzutowanie z jednego typu do drugiego za pomocą jednego z następujących metod:
Jawne rzutowania, jak za pomocą Rzutowanie jako lub funkcji konstruktora typu (na przykład, xs:integer("5")).
Rzutowanie niejawna występuje podczas podwyższania typu
Jawne rzutowania
W poniższej tabela podano rzutowanie typu dozwolonych między wbudowanych typów pierwotnych.
Wbudowane podstawowego typu mogą być rzutowane na inne wbudowane podstawowego typu, na podstawie reguł w tabela.
Podstawowego typu mogą być rzutowane na dowolnego typu, pochodzące z tego typu podstawowego.Na przykład które mogą być rzutowane z xs:decimal to xs:Integer, or from xs:decimal to xs:Long.
Typ pochodny mogą być rzutowane na dowolnego typu, który jest jego element nadrzędny w hierarchii typu Dosunięty do jego pierwotne wbudowany typ podstawowy.Na przykład które mogą być rzutowane z xs:token to xs:normalizedString or to xs:ciąg.
Typ pochodny mogą być rzutowane na podstawowego typu, jeśli jego element nadrzędny pierwotnych mogą być rzutowane na typ miejsce docelowe.Na przykład można można rzutować xs:Integer, typu pochodnego do xs:ciąg, podstawowego typu, ponieważ xs:decimal, xs:Integerpierwotne element nadrzędny, mogą być rzutowane na xs:ciąg.
Typ pochodny mogą być rzutowane na innego typu pochodnego, jeśli pierwotny element nadrzędny typ urządzenie źródłowe mogą być rzutowane na pierwotny element nadrzędny typ miejsce docelowe.Na przykład które mogą być rzutowane z xs:Integer to xs:token, ponieważ mogą być rzutowane z xs:decimal to xs:ciąg.
Rzutowanie typów zdefiniowanych przez użytkownika do wbudowanych typów zasady są takie same, jak w przypadku wbudowanych typów.Na przykład, można zdefiniować myInteger typu pochodną xs:Integer typu.Następnie, myInteger mogą być rzutowane na xs:token, because xs:decimal mogą być rzutowane na xs:ciąg.
Nie są obsługiwane następujące rodzaje rzutowania:
Rzutowanie do lub z listy typów nie jest dozwolone.Obejmuje ona zarówno typów zdefiniowanych przez użytkownika listy, jak i wbudowanej listy typów, takich jak xs:IDREFS, xs:ENTITIES, and xs:NMTOKENS.
Rzutowanie do lub z xs:QName nie jest obsługiwana.
xs:NOTATION i pełni zamówione podtypów czas trwania, XDT:yearMonthDuration and XDT:dayTimeDuration, nie są obsługiwane.W rezultacie rzutowania do lub z tych typów nie jest obsługiwana.
Poniższe przykłady ilustrują jawne typ rzutowania.
Dlatego wartość predykatu prawdziwość to wyrażenie ma wartość true tylko dla węzłów, którego położenie kontekstu jest 3.
W poniższym przykładzie kwerendy jest zmienna typu danych xml.Zwraca ciąg wartości typu prostego jako xs:string wpisana.
declare @x xml
set @x = '<e>1</e><e>2</e>'
select @x.query('/e[1] cast as xs:string?')
go
Przykład B
W poniższym przykładzie kwerendy zmiennej wpisywanych xml.W przykładzie najpierw tworzy kolekcja schematu XML.Następnie użyto kolekcja schematu XML do utworzenia zmiennej wpisywanych xml.Schemat zawiera wpisując informacje XML, wystąpienie przypisana do zmiennej.Następnie określono kwerendy wobec 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 kwerendy zwracają błąd statycznych, ponieważ nie wiadomo, ile najwyższego poziom <root> elementy są w dokumencie wystąpienie.
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
Określając pojedyncza <root> element w wyrażeniu kwerendy zakończy się pomyślnie. Zwraca ciąg wartości typu prostego jako xs:string wpisana.
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 dokumentu, określająca kolekcja schematu XML.Oznacza to, że wystąpienie XML musi być dokument, który ma jeden element najwyższego poziom.Po utworzeniu dwóch <root> elementy w kolejności XML, zwróci 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
Wystąpienie elementu tylko jeden najwyższego poziom i roboty kwerendy można zmienić.Ponownie kwerenda zwraca ciąg wartości typu prostego jako xs:string wpisana.
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
Niejawna rzutowania
Rzutowanie niejawne jest dozwolona tylko dla typów numerycznych i bez typu niepodzielny typów.Na przykład następujące min() funkcja zwraca wartość co najmniej dwie wartości:
min(xs:integer("1"), xs:double("1.1"))
W tym przykładzie dwie wartości przekazany do XQuery min() funkcja są różnych typów.Dlatego niejawna konwersja jest przeprowadzana w przypadku gdy Liczba całkowita jest promowany typu podwójne i dwa podwójne wartości są porównywane.
Promocja typu zgodnie z opisem w tym przykładzie te zasady są następujące:
Wbudowane numeryczne typu pochodnego może być podwyższony do jego typ podstawowy.Na przykład Liczba całkowita może być promowany Liczba dziesiętna.
A Liczba dziesiętna może być promowany Float, and a zmiennoprzecinkowe może być promowany podwójne.
Ponieważ rzutowania niejawne jest dozwolona tylko dla typów numerycznych, poniżej nie jest dozwolone:
Niejawna rzutowania dla typu ciąg nie jest dozwolone.Na przykład, jeśli dwa ciąg znaków oczekiwane są typy i przekazać ciąg znaków and a Token, pojawia się nie oczywiste rzutowania i zwracany jest błąd.
Niejawna rzutowanie typów liczbowych typów ciąg nie jest dozwolone.Na przykład jeśli wartość całkowitą typu zostanie przekazany do funkcja, która jest oczekiwana parametrem typu ciąg znaków, pojawia się nie oczywiste rzutowania i zwracany jest błąd.
Rzutowanie wartości
Podczas rzutowanie z jednego typu do drugiego, wartości rzeczywiste są przekształcane do obszaru wartości typ miejsce docelowe's z miejsca na wartość typu urządzenie źródłowe.Na przykład rzutowanie xs:decimal an xs:double będzie przekształcać wartości dziesiętne na wartość podwójną.
Poniżej przedstawiono niektóre reguły transformacja.
Rzutowanie wartość typu ciąg znaków lub untypedAtomic
Wartość, która jest jest rzutować typu ciąg znaków lub untypedAtomic jest przekształcana w taki sam sposób jak sprawdzanie poprawności oparte na regułach typ docelowy's wartość.Dotyczy to również ewentualnych wzorca i reguły przetwarzania białe miejsca.Na przykład, następujące będzie powiodła się i generuje wartość podwójna 1.1e0:
xs:double("1.1")
Gdy rzutowanie dla binarnych typów, takich jak xs:base64Binary lub xs:hexBinary z typu ciąg znaków lub untypedAtomic, muszą być base64 albo szesnastkowy zakodowany, odpowiednio wartości wejściowych.
Rzutowanie wartość typu ciąg znaków lub untypedAtomic
Rzutowanie ciąg lub untypedAtomic typu przekształca wartości do jego XQuery kanoniczna reprezentacji leksykalne.W szczególności oznacza to wartość, która może być przestrzegane określonego wzorca lub inne ograniczenia podczas wprowadzania nie będą reprezentowane zgodnie z tym ograniczeniem.Aby poinformować użytkowników o tym, SQL Server flagi typów ograniczenia typu może być problem podczas ładowania tych typów do kolekcja schematu, zapewniając ostrzeżenie.
Gdy Rzutowanie wartości typu xs:float xs:double lub jeden z ich podtypów typu ciąg znaków lub untypedAtomic, wartość jest reprezentowany w notacji naukowej.Można to zrobić tylko wtedy, gdy jej wartość bezwzględna jest mniejsza niż 1.0E - 6, lub większa niż lub równą 1.0E6.Oznacza to, że 0 jest seryjny w notacji naukowej do 0.0E0.
Na przykład xs:string(1.11e1) Zwraca wartość ciąg "11.1", podczas gdy xs:string(-0.00000000002e0) Zwraca wartość ciąg "-2.0E-11".
Rzutowanie binarnych typów, takich jak xs:base64Binary lub xs:hexBinary do typu ciąg znaków lub untypedAtomic wartości binarnych będzie można przedstawić w ich base64 lub liczba szesnastkowa zakodowanej formie, odpowiednio.
Rzutowanie wartości typu liczbowego
Podczas Rzutowanie wartości jednego typu numerycznego na wartość innego typu liczbowego, wartość jest mapowany z jednej wartości obszaru do drugiego bez pośrednictwa serializacji ciąg.Jeśli wartość nie spełnia ograniczenia z typ docelowy, obowiązują następujące reguły:
Jeżeli już jest liczbą wartość źródłową oraz typ miejsce docelowe jest podtypem ich umożliwiający - INF lub plik INF albo xs:float wartości i rzutowania wartości liczbowej urządzenie źródłowe spowodowałoby przepełnienie, wartość jest mapowany do pliku INF, jeśli wartość jest dodatni lub INF, jeśli wartość jest liczbą ujemną.Jeśli typ miejsce docelowe nie zezwala na pliku INF lub - INF i przepełnienie mogą się pojawić, rzutowania nie powiedzie się i wyniki jego działania w tej wersji programu SQL Server jest sekwencją puste.
Jeżeli już jest liczbą wartość źródłową oraz typ docelowy jest typu liczbowego, który zawiera 0, - 0e0 lub 0e0 w jej zakres akceptowanych wartości i rzutowania wartości liczbowej urządzenie źródłowe może spowodować wystąpienie błędu niedopełnienia, wartość jest mapowany na kilka sposobów:
Wartość jest mapowany na 0 w przypadku ułamek dziesiętny typ miejsce docelowe.
Wartość jest mapowany do 0e0 ma wartość ujemną niedomiar.
Wartość jest mapowany na 0e0 ma wartość dodatnią Niedopełnienie zmiennoprzecinkowe lub dwukrotnie typ miejsce docelowe.
Jeśli typ miejsce docelowe nie zawiera zero w miejsce jego wartości, rzutowania kończy się niepowodzeniem, a wynik jest pusta sekwencji.
Należy zauważyć, że wartości w postaci dwójkowej, zmienna typu punkt, takie jak xs:float, xs:double lub dowolną ich podtypach rzutowanie może spowodować utratę precyzji.
defaultButton
Ograniczenia są następujące:
Zmiennoprzecinkowe punkt wartość NaN nie jest obsługiwana.
Castable wartości są ograniczone przez ograniczenia implementacji typu docelowego.Na przykład nie można rzutować ciąg data z rokiem wyrażonym ujemnych do xs:date. Takich prezentacji spowoduje sekwencji puste, jeśli wartość jest określana w czasie wykonywania (zamiast podnoszenie błąd czas wykonania).