Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Následující diagram specifikace funkcí a operátorů W3C XQuery 1.0 a XPath 2.0 znázorňuje předdefinované datové typy. To zahrnuje předdefinované primitivní a předdefinované odvozené typy.
Toto téma popisuje pravidla přetypování typů, která se použijí při přetypování z jednoho typu do druhého pomocí jedné z následujících metod:
Explicitní přetypování, které provedete pomocí přetypování jako nebo funkcí konstruktoru typu (například
xs:integer("5")).Implicitní přetypování, ke kterému dochází během povýšení typu
Explicitní přetypování
Následující tabulka popisuje povolený přetypování typů mezi předdefinované primitivní typy.
Předdefinovaný primitivní typ může přetypovat na jiný předdefinovaný primitivní typ na základě pravidel v tabulce.
Primitivní typ lze přetypovat na libovolný typ odvozený z daného primitivního typu. Můžete například přetypovat xs:decimal na xs:integernebo z xs:decimal na xs:long.
Odvozený typ lze přetypovat na libovolný typ, který je jeho nadřazený v hierarchii typů, až po předdefinovaný primitivní základní typ. Můžete například přetypovat xs:token na xs:normalizedString nebo xs:string.
Odvozený typ lze přetypovat na primitivní typ, pokud jeho primitivní nadřazený objekt lze přetypovat na cílový typ. Můžete například přetypovat xs:integer, odvozený typ na xs:string, primitivní typ, protože xs:decimal, xs:integerprimitivního předka, lze přetypovat na xs:string.
Odvozený typ lze přetypovat na jiný odvozený typ, pokud primitivní nadřazený typ zdroje lze přetypovat na primitivního nadřazeného objektu cílového typu. Můžete například přetypovat xs:integer na xs:token, protože můžete přetypovat z xs:decimal na xs:string.
Pravidla pro přetypování uživatelem definovaných typů na předdefinované typy jsou stejná jako u předdefinovaných typů. Můžete například definovat typ myInteger odvozený z typu xs:integer. Potom lze myInteger přetypovat na xs:token, protože xs:decimal lze přetypovat na xs:string.
Následující druhy přetypování nejsou podporovány:
Přetypování do nebo z typů seznamů není povoleno. To zahrnuje uživatelem definované typy seznamů i předdefinované typy seznamů, jako jsou xs:IDREFS, xs:ENTITIESa xs:NMTOKENS.
Přetypování do xs:QName se nepodporuje.
xs:NOTATION a plně seřazené podtypy doby trvání, xdt:yearMonthDuration a xdt:dayTimeDuration, nejsou podporovány. V důsledku toho se přetypování na tyto typy nebo z nich nepodporuje.
Následující příklady znázorňují explicitní přetypování typů.
Příklad A
Následující příklad dotazuje proměnnou typu XML. Dotaz vrátí sekvenci jednoduché hodnoty typu zadané jako xs:string.
declare @x xml
set @x = '<e>1</e><e>2</e>'
select @x.query('/e[1] cast as xs:string?')
go
Příklad B
Následující příklad dotazuje typovou proměnnou XML. Příklad nejprve vytvoří kolekci schémat XML. Potom pomocí kolekce schémat XML vytvoří typovou proměnnou XML. Schéma poskytuje informace o psaní pro instanci XML přiřazenou proměnné. Dotazy se pak zadají pro proměnnou.
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
Následující dotaz vrátí statickou chybu, protože nevíte, kolik prvků nejvyšší úrovně <root> jsou v instanci 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
Zadáním elementu singleton <root> ve výrazu bude dotaz úspěšný. Dotaz vrátí sekvenci jednoduché hodnoty typu zadané 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
V následujícím příkladu proměnná typu XML obsahuje klíčové slovo dokumentu, které určuje kolekci schémat XML. To znamená, že instance XML musí být dokument, který má jeden element nejvyšší úrovně. Pokud v instanci XML vytvoříte dva <root> elementy, vrátí se chyba.
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
Instanci můžete změnit tak, aby zahrnovala pouze jeden prvek nejvyšší úrovně a dotaz funguje. Dotaz opět vrátí sekvenci hodnoty jednoduchého typu, která je zadaná 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
Implicitní přetypování
Implicitní přetypování je povoleno pouze pro číselné typy a netypové atomické typy. Například následující min() funkce vrátí minimum dvou hodnot:
min(xs:integer("1"), xs:double("1.1"))
V tomto příkladu jsou dvě hodnoty předané funkci XQuery min() různých typů. Proto je implicitní převod proveden, kde celočíselné typ je povýšen na dvojité a dva dvojité hodnoty jsou porovnány.
Povýšení typu, jak je popsáno v tomto příkladu, se řídí těmito pravidly:
Předdefinovaný odvozený číselný typ může být povýšen na základní typ. Například celé číslo může být povýšeno na desetinných.
Desetinná může být povýšena na float, a plovoucí mohou být povýšeny na dvojité.
Vzhledem k tomu, že implicitní přetypování je povoleno pouze pro číselné typy, není povoleno následující:
Implicitní přetypování pro typy řetězců není povoleno. Pokud jsou například očekávány dva typy řetězců a předáte řetězec a token , nedojde k implicitní přetypování a vrátí se chyba.
Implicitní přetypování z číselných typů na typy řetězců není povoleno. Pokud například předáte celočíselnou hodnotu funkci, která očekává parametr typu řetězce, nedojde k implicitní přetypování a vrátí se chyba.
Přetypování hodnot
Při přetypování z jednoho typu do druhého se skutečné hodnoty transformují z hodnotového prostoru zdrojového typu na prostor hodnot cílového typu. Například přetypování z xs:decimal na xs:double transformuje desetinnou hodnotu na dvojitou hodnotu.
Následuje několik pravidel transformace.
Přetypování hodnoty z řetězce nebo netypového typu
Hodnota přetypovaná na řetězec nebo typ beztypu Je transformována stejným způsobem jako ověřování hodnoty na základě pravidel cílového typu. To zahrnuje případná pravidla zpracování a zpracování prázdných znaků. Následující příklad bude úspěšný a vygeneruje dvojitou hodnotu 1,1e0:
xs:double("1.1")
Při přetypování na binární typy, jako jsou xs:base64Binary nebo xs:hexBinary z řetězce nebo netypového typuAtomic, vstupní hodnoty musí být base64 nebo šestnáctkové kódované.
Přetypování hodnoty na řetězec nebo netypový typAtomic
Přetypování na řetězec nebo netypový typAtomic transformuje hodnotu na jeho kanonickou lexikální reprezentaci XQuery. Konkrétně to může znamenat, že hodnota, která mohla dodržovat určitý vzor nebo jiné omezení během vstupu, nebude reprezentována podle tohoto omezení. Chcete-li o tom informovat uživatele, SQL Server označí typy, ve kterých může být omezení typu problém tím, že poskytne upozornění, když jsou tyto typy načteny do kolekce schémat.
Při přetypování hodnoty typu xs:float nebo xs:double nebo některého z jejich podtypů na řetězec nebo netypový typAtomic je hodnota reprezentována ve vědeckém zápisu. To se provádí pouze v případě, že absolutní hodnota hodnoty je menší než 1,0E-6 nebo větší nebo rovna 1,0E6. To znamená, že 0 je serializováno ve vědeckém zápisu na 0,0E0.
Například xs:string(1.11e1) vrátí řetězcovou hodnotu "11.1", zatímco xs:string(-0.00000000002e0) vrátí řetězcovou hodnotu "-2.0E-11".
Při přetypování binárních typů, jako jsou xs:base64Binary nebo xs:hexBinary, na řetězec nebo netypický typAtomic, budou binární hodnoty reprezentovány v jejich formátu s kódováním base64 nebo šestnáctkovém formátu.
Přetypování hodnoty na číselný typ
Při přetypování hodnoty jednoho číselného typu na hodnotu jiného číselného typu se hodnota mapuje z jednoho prostoru hodnot na druhý, aniž by procházela serializace řetězců. Pokud hodnota nevyhovuje omezení cílového typu, platí následující pravidla:
Pokud je zdrojová hodnota již číselná a cílový typ je buď xs:float, nebo jeho podtyp, který umožňuje -INF nebo INF hodnoty a přetypování zdrojové číselné hodnoty by vedlo k přetečení, hodnota se mapuje na INF, pokud je hodnota kladná nebo -INF, pokud je hodnota záporná. Pokud cílový typ nepovoluje inf nebo -INF a dojde k přetečení, přetypování selže a výsledek v této verzi SQL Serveru je prázdná sekvence.
Pokud je zdrojová hodnota již číselná a cílový typ je číselný typ, který obsahuje hodnotu 0, -0e0 nebo 0e0 v přijatém rozsahu hodnot a přetypování zdrojové číselné hodnoty by vedlo k podtečení, tato hodnota se mapuje následujícími způsoby:
Hodnota je namapována na hodnotu 0 pro typ desetinného cíle.
Hodnota se mapuje na -0e0, pokud je hodnota záporným podtečením.
Hodnota je namapována na hodnotu 0e0, pokud je hodnota kladným podtečením pro typ plovoucího nebo dvojitého cíle.
Pokud cílový typ nezahrne nula do jeho místa pro hodnotu, přetypování selže a výsledek je prázdná sekvence.
Všimněte si, že přetypování hodnoty na binární typ s plovoucí desetinnou čárkou, například xs:float, xs:double nebo některý z jejich podtypů, může ztratit přesnost.
Omezení implementace
Toto jsou omezení:
Hodnota naN s plovoucí desetinnou čárkou není podporována.
Hodnoty přetypování jsou omezeny omezeními implementace cílových typů. Například nelze přetypovat řetězec kalendářního data se záporným rokem na xs:date. Takové přetypování způsobí prázdnou sekvenci, pokud je hodnota za běhu zadaná (místo vyvolání chyby za běhu).