Typ rzutowania reguł w XQuery
Na poniższym diagramie specyfikacji W3C XQuery 1.0 i funkcje XPath 2.0 i operatorów zawiera wbudowane typy danych.Zawiera wbudowane pierwotne i wbudowanych typów pochodnych.
W tym temacie opisano reguły rzutowanie typu, które są stosowane podczas rzutowanie z jednego typu do drugiego przy użyciu jednej z następujących metod:
Jawne, który oddał zrobić za pomocą rzucie jako lub funkcji konstruktora typu (na przykład xs:integer("5")).
Rzutowanie niejawna występuje podczas podwyższania typu
Jawne odlewania
W poniższej tabela przedstawiono rzutowanie typu dozwolonych między wbudowanych typów pierwotnych.
Wbudowany typ pierwotny można rzutować na inny wbudowany typ pierwotny, na podstawie reguł w tabela.
Typ pierwotny można rzutować na dowolnego typu, pochodzące z tego typu pierwotnych.Na przykład można rzutować z xs:decimal do xs:integer, lub z xs:decimal do xs:long.
Typu pochodnego można rzutować na dowolnego typu, który jest jego element nadrzędny w hierarchii typu Dosunięty do wbudowanych pierwotny typ bazowy.Na przykład można rzutować z xs:token do xs:normalizedString lub xs:ciąg.
Można rzutować typu pochodnego typ pierwotny, jeśli jego pierwotne element nadrzędny można rzutować na typ miejsce docelowe.Na przykład można rzutować xs:integer, pochodnych typu, do xs:ciąg, pierwotne typu, ponieważ xs:decimal, xs:integerprzez pierwotny element nadrzędny, można rzutować na xs:ciąg.
Można rzutować typu pochodnego innego typu pochodnego, jeśli pierwotny element nadrzędny typ źródło można rzutować na typ miejsce docelowejego pierwotne nadrzędnego.Na przykład można rzutować z xs:integer do xs:token, ponieważ można rzutować z xs:decimal do xs:ciąg.
Rzutowanie typów zdefiniowanych przez użytkownika do wbudowanych typów reguł są takie same, jak w przypadku wbudowanych typów.Na przykład można zdefiniować myInteger typu pochodzące z xs:integer typu.Następnie myInteger można rzutować na xs:token, ponieważ xs:decimal można rzutować na xs:ciąg.
Następujące rodzaje Rzutowanie nie są obsługiwane:
Rzutowanie do lub z listy typów nie jest dozwolone.Obejmuje takie jak typy zdefiniowane przez użytkownika lista i wbudowanej listy typów xs:IDREFS, xs:ENTITIES, i xs:NMTOKENS.
Rzutowanie do lub z xs:QName nie jest obsługiwane.
xs:NOTATION i pełni zamówione podtypów czas trwania, xdt:yearMonthDuration i xdt:dayTimeDuration, nie są obsługiwane.W wyniku odlewania do lub z tych typów nie jest obsługiwane.
Poniższe przykłady ilustrują odlewania typem jawnym.
Przykład A
Poniższy przykład kwerendy xml typu zmiennej.Kwerenda zwraca sekwencja wartości typu prostego wpisana jako xs:ciąg.
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 kwerendy zmiennej maszynowy xml.Przykład najpierw tworzy kolekcja schematu XML.Następnie używa kolekcja schematu XML do utworzenia zmiennej maszynowy xml.Schemat zawiera wpisywania informacji dla wystąpienie XML 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ąca kwerenda zwraca błąd statyczne, ponieważ nie wiadomo, ile najwyższego poziom <root> są elementy 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żenie, kwerenda zakończy się pomyślnie.Kwerenda zwraca sekwencja wartości typu prostego wpisana jako xs:ciąg.
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, która określa kolekcja schematu XML.Wskazuje, że wystąpienie XML musi być dokumentu, który ma jeden element najwyższego poziom.Jeśli należy utworzyć dwa <root> elementów XML wystąpienie, 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 dołączyć tylko jeden element górnego poziom i works kwerendy można zmienić.Ponownie kwerenda zwraca sekwencja wartości typu prostego wpisana jako xs:ciąg.
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 odlewania
Niejawna odlewania jest dozwolona tylko dla typów liczbowych i bez typów niepodzielny.Na przykład, następujący min() funkcja zwraca 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 gdzie całkowitą typu jest podnoszony do podwójne i dwa podwójne wartości są porównywane.
Promocja typu opisanych w tym przykładzie obowiązują następujące reguły:
Wbudowane pochodnych typu liczbowego może być podwyższony do jego typ podstawowy.Na przykład całkowitą może być podwyższony do dziesiętny.
A dziesiętny może być podwyższony do pływaka, i pływaka może być podwyższony do podwójne.
Ponieważ odlewania niejawne jest dozwolona tylko dla typów numerycznych, następuje nie jest dozwolone:
Rzutowanie niejawne typów ciąg nie jest dozwolone.Na przykład, jeśli dwa ciąg oczekiwane są typy i przebiegu w ciąg i token, występuje nie rzutowania niejawna i zwracany jest błąd.
Rzutowanie niejawna typy liczbowe typy ciąg nie jest dozwolone.Na przykład wartość całkowitą typu przekazać do funkcja, która jest oczekiwana parametr typu ciąg, występuje nie rzutowania niejawne, i zwracany jest błąd.
Rzutowanie wartości
Gdy rzutowanie z jednego typu do drugiego, wartości rzeczywiste są przekształcane z miejsca na wartość typu źródło, aby typ miejsce docelowena wartość miejsca.Na przykład rzutowanie xs:decimal xs:double będzie przekształcania wartość dziesiętna podwójna wartość.
Poniżej przedstawiono niektóre reguły transformacja.
Rzutowanie wartości typu ciąg lub untypedAtomic
Wartość, która jest jest rzutować na typ ciąg lub untypedAtomic jest przekształcana w taki sam sposób jak sprawdzanie poprawności oparte na wartość typ docelowyprzez zasady.Obejmuje to ewentualnego wzorca i reguły przetwarzania spacji.Na przykład, następujące zostanie pomyślnie i generowania podwójna wartość 1.1e0:
xs:double("1.1")
Gdy Rzutowanie na typy binarny, takie jak xs:base64Binary lub xs:hexBinary z typu ciąg znaków lub untypedAtomic, wartości wejściowe muszą być base64 albo hex zakodowany, odpowiednio.
Rzutowanie wartości typu ciąg lub untypedAtomic
Rzutowanie na ciąg znaków lub untypedAtomic typu przekształca wartość jego XQuery kanoniczny reprezentację leksykalne.To w szczególności oznaczać, że wartość, która może być przestrzegane określonego wzorca lub inne ograniczenie, podczas wprowadzania nie będą reprezentowane zgodnie z tym ograniczeniem.Aby poinformować użytkowników o tym, SQL Server Typy flag, gdzie ograniczenie typu może być problem, dostarczając ostrzeżenie podczas tych typów są ładowane do kolekcja schematu.
Rzutowanie wartości typu xs:float lub xs:double lub dowolną ich podtypy typu ciąg znaków lub untypedAtomic, gdy wartość jest reprezentowany w notacji naukowej.Można to zrobić tylko wtedy, gdy wartość bezwzględna jest mniejsza niż 1.0e-6, lub większą lub równą 1.0E6.Oznacza to, że 0 jest seryjny w notacji naukowej do 0.0E0.
Na przykład xs:string(1.11e1) zwróci wartość ciąg "11.1", podczas xs:string(-0.00000000002e0) zwróci wartość ciąg "-2.0E-11".
Rzutowanie binarnych typów, takich jak xs:base64Binary lub xs:hexBinary typu ciąg znaków lub untypedAtomic wartości binarnych będą reprezentowane w ich base64 lub odpowiednio szesnastkowe zakodowanej formie.
Rzutowanie wartości typu liczbowego
Gdy Rzutowanie wartości jednego typu liczbowego wartość innego typu liczbowego, wartość jest mapowany z obszaru jednej wartości innych bez pośrednictwa serializacji ciąg.Jeśli wartość nie spełnia ograniczenia z typ miejsce docelowe, obowiązują następujące reguły:
Jeśli wartość źródłowa jest już numeryczne i typ miejsce docelowe jest xs:float lub ich podtypu, umożliwiający -INF lub pliku INF wartości i odlewania wartość liczbową źródło spowodowałoby przepełnienie, wartość jest mapowany do INF, jeśli wartość jest dodatnią lub -INF wartości ujemnych.Jeśli typ miejsce docelowe nie zezwala na wystąpiłoby INF lub -INF i przepełnienie, wytopu nie powiedzie się i wynik w tej wersji programu SQL Server jest pusty.
Jeśli wartość źródłowa jest już numeryczne i typ miejsce docelowe jest typu liczbowego, który zawiera 0, - 0e0 lub 0e0 w jej zakres akceptowanych wartości i odlewania wartość liczbową źródło spowodowałoby niedomiar, wartość jest mapowany na następujące sposoby::
Wartość jest mapowany na 0 dziesiętne typ docelowy.
Wartość jest mapowany na - 0e0, gdy wartość jest ujemna niedomiar.
Wartość jest mapowany na 0e0, gdy wartość jest dodatnia niedomiar float lub double typ miejsce docelowe.
Jeśli typ miejsce docelowe nie zawiera zero w jego miejsce wartość wytopu ulegnie awarii, a wynik jest pusta sekwencji.
Należy zauważyć, że wartość binarna zmiennoprzecinkowych typu punkt, takie jak xs:float, xs:double lub dowolną ich podtypach rzutowanie może spowodować utratę precyzji.
Ograniczenia wdrażania
Są następujące ograniczenia:
Zmiennoprzecinkowych wartości NaN nie jest obsługiwane.
Wartości castable są ograniczone przez ograniczenia implementacji typów miejsce docelowe.Na przykład nie można rzutować ciąg data z ujemną roku xs:date.Takie poświaty spowoduje pusty sekwencji ile wartość przy uruchomieniu czas (zamiast podnoszenie Uruchom -czas błąd).