Sdílet prostřednictvím


Převod datového typu (databázový stroj)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Datové typy je možné převést v následujících scénářích:

  • Když se data z jednoho objektu přesunou, porovná se nebo zkombinují s daty z jiného objektu, může být nutné data převést z datového typu jednoho objektu na datový typ druhého objektu.
  • Pokud se data ze sloupce výsledků Transact-SQL, návratový kód nebo výstupní parametr přesunou do proměnné programu, musí být data převedena ze systémového datového typu SQL Serveru na datový typ proměnné.

Při převodu mezi proměnnou aplikace a sloupcem sady výsledků SQL Serveru, návratovým kódem, parametrem nebo značkou parametru jsou podporované převody datových typů definovány rozhraním API databáze.

Implicitní a explicitní převod

Datové typy je možné převést implicitně nebo explicitně.

Implicitní převody nejsou uživateli viditelné. SQL Server automaticky převede data z jednoho datového typu na jiný. Pokud je například malýint porovnán s int, je malýint implicitně převeden na int před zahájením porovnání.

GETDATE() implicitně se převede na styl0 data. SYSDATETIME() implicitně se převede na styl 21data .

Explicitní převody používají CAST funkce.CONVERT

Funkce CAST a CONVERT převádějí hodnotu (místní proměnnou, sloupec nebo jiný výraz) z jednoho datového typu na jiný. Například následující CAST funkce převede číselnou hodnotu $157.27 na řetězec '157.27'znaků:

CAST ( $157.27 AS VARCHAR(10) )  

CAST Místo CONVERT toho, pokud chcete Transact-SQL kód programu, aby byl v souladu se standardem ISO. CONVERT Místo CAST toho, abyste využili funkce stylu v CONVERT.

Následující obrázek znázorňuje všechny explicitní a implicitní převody datových typů, které jsou povoleny pro systémové datové typy zadané systémem SQL Serveru. Patří sem xml, bigint a sql_variant. U přiřazení z datového typu sql_variant neexistuje implicitní převod, ale implicitní převod na sql_variant.

Podrobná tabulka obsahující všechny datové typy SQL v řádcích a sloupcích označující, které typy převodů datových typů jsou možné.

I když předchozí graf znázorňuje všechny explicitní a implicitní převody, které jsou povoleny v SQL Serveru, nezvýší výsledný datový typ převodu.

  • Když SQL Server provede explicitní převod, samotný příkaz určuje výsledný datový typ.
  • U implicitních převodů příkazy přiřazení, jako je nastavení hodnoty proměnné nebo vložení hodnoty do sloupce, mají za následek datový typ, který byl definován deklarací proměnné nebo definicí sloupce.
  • U relačních operátorů nebo jiných výrazů závisí výsledný datový typ na pravidlech priority datového typu.

Například následující skript definuje proměnnou typu varchar, přiřadí proměnné typu varchar hodnotu typu int proměnné a pak vybere zřetězení proměnné s řetězcem.

DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'

Hodnota int1 je převedena na varchar, takže SELECT příkaz vrátí hodnotu 1 is a string..

Následující příklad ukazuje podobný skript s proměnnou int místo toho:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.'

V tomto případě příkaz SELECT vyvolá následující chybu:

Msg 245, Level 16, State 1, Line 3 Conversion failed when converting the varchar value ' is not a string.' to data type int.

Aby bylo možné výraz vyhodnotit @notastring + ' is not a string.', SQL Server se řídí pravidly priorit datového typu k dokončení implicitního převodu před výsledkem výrazu lze vypočítat. Protože int má vyšší prioritu než varchar, SQL Server se pokusí převést řetězec na celé číslo a selže, protože tento řetězec nelze převést na celé číslo. Pokud výraz poskytuje řetězec, který lze převést, příkaz bude úspěšný, jako v následujícím příkladu:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'

V tomto případě lze řetězec 1 převést na celočíselnou hodnotu 1, takže tento SELECT příkaz vrátí hodnotu 2. Operátor + se stane sčítáním, nikoli zřetězením, pokud zadané datové typy jsou celá čísla.

Chování převodu datových typů

Některé implicitní a explicitní převody datových typů nejsou podporovány při převodu datového typu jednoho objektu SQL Serveru na jiný. Například hodnotu nchar nelze převést na hodnotu obrázku . Nchar lze převést pouze na binární pomocí explicitního převodu. Implicitní převod na binární soubor není podporován. Nchar však může být explicitně nebo implicitně převeden na nvarchar.

Následující články popisují chování převodu, které vykazuje jejich odpovídající datové typy:

Převod datových typů pomocí uložených procedur OLE Automation

Vzhledem k tomu, že SQL Server používá Transact-SQL datových typů a automatizace OLE používá datové typy jazyka Visual Basic, musí uložené procedury OLE převést data, která se mezi nimi předají.

Následující tabulka popisuje převody datových typů sql Serveru do jazyka Visual Basic.

Datový typ SQL Serveru Datový typ Jazyka Visual Basic
char, varchar, text, nvarchar, ntext String
Desetinné, číselné String
bit Boolean
Binární, varbinární, obraz Jednorozměrné Byte() pole
int Long
smallint Integer
tinyint Byte
float Double
real Single
money, smallmoney Currency
Rande,malérandečas Date
Cokoli je nastavené na NULL Varianta nastavená na hodnotu Null

Všechny hodnoty SQL Serveru se převedou na jednu hodnotu jazyka Visual Basic s výjimkou binárních hodnot, varbinary a obrázků . Tyto hodnoty se v jazyce Visual Basic převedou na jednorozměrné Byte() pole. Toto pole má rozsah, ve Byte( 0 to length 1) kterém je délka počtu bajtů v binárním souboru SQL Serveru, varbinary nebo hodnoty obrázků .

Jedná se o převody z datových typů jazyka Visual Basic na datové typy SQL Serveru.

Datový typ Jazyka Visual Basic Datový typ SQL Serveru
Dlouhé, celočíselné, bajtové, booleovské, objektové int
Dvojitý, jednolůžkový float
Currency money
Date datetime
Řetězec s 4 000 znaky nebo méně varchar/nvarchar
Řetězec s více než 4 000 znaky Text/ntext
Jednorozměrné Byte() pole s 8 000 bajty nebo méně varbinary
Jednorozměrné Byte() pole s více než 8 000 bajty image