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

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsKoncový 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í konverze 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. Neexistuje implicitní konverze při přiřazení z sql_variant datového typu, ale existuje implicitní konverze na sql_variant.

Diagram podrobné tabulky obsahující všechny SQL datové typy v řádcích a sloupcích, ukazující, jaké typy převodů datových typů jsou možné.

Zatímco předchozí graf ilustruje všechny explicitní i implicitní konverze, které jsou v SQL Server povoleny, neukazuje výsledný datový typ konverze.

  • 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 AS 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 AS 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 AS 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, když převádíte datový typ jednoho objektu SQL Server 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 do binárního formátu 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
peníze, drobné peníze 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