Преобразование типов данных (ядро СУБД)Data type conversion (Database Engine)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Преобразование типов данных происходит в следующих случаях:Data types can be converted in the following scenarios:

  • При перемещении, сравнении или объединении данных одного объекта с данными другого объекта эти данные могут преобразовываться из одного типа в другой.When data from one object is moved to, compared with, or combined with data from another object, the data may have to be converted from the data type of one object to the data type of the other.
  • При передаче в переменную программы данных из результирующего столбца Transact-SQLTransact-SQL, кода возврата или параметра вывода эти данные должны преобразовываться из системного типа данных SQL ServerSQL Server в тип данных переменной.When data from a Transact-SQLTransact-SQL result column, return code, or output parameter is moved into a program variable, the data must be converted from the SQL ServerSQL Server system data type to the data type of the variable.

При взаимных преобразованиях переменных приложения и столбцов результирующих наборов SQL ServerSQL Server, кодов возврата, параметров и маркеров параметров поддерживаемые преобразования типов данных определяются API базы данных.When you convert between an application variable and a SQL ServerSQL Server result set column, return code, parameter, or parameter marker, the supported data type conversions are defined by the database API.

Явное и неявное преобразованиеImplicit and explicit conversion

Преобразование типов данных бывает явным и неявным.Data types can be converted either implicitly or explicitly.

Неявное преобразование скрыто от пользователя.Implicit conversions are not visible to the user. SQL ServerSQL Server автоматически преобразует данные из одного типа в другой.automatically converts the data from one data type to another. Например, если smallint сравнивается с int, то перед сравнением smallint неявно преобразуется в int.For example, when a smallint is compared to an int, the smallint is implicitly converted to int before the comparison proceeds.

GETDATE() выполняет неявное преобразование в стиль даты 0.GETDATE() implicitly converts to date style 0. SYSDATETIME() выполняет неявное преобразование в стиль даты 21.SYSDATETIME() implicitly converts to date style 21.

Явное преобразование выполняется с помощью функций CAST и CONVERT.Explicit conversions use the CAST or CONVERT functions.

Функции CAST и CONVERT преобразуют значение (локальную переменную, столбец или выражение) из одного типа данных в другой.The CAST and CONVERT functions convert a value (a local variable, a column, or another expression) from one data type to another. Например, приведенная ниже функция CAST преобразует числовое значение $157.27 в строку символов '157.27':For example, the following CAST function converts the numeric value of $157.27 into a character string of '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Если программный код Transact-SQLTransact-SQL должен соответствовать требованиям ISO, используйте функцию CAST вместо CONVERT.Use CAST instead of CONVERT if you want Transact-SQLTransact-SQL program code to comply with ISO. Использование функции CONVERT вместо CAST дает преимущество в дополнительной функциональности.Use CONVERT instead of CAST to take advantage of the style functionality in CONVERT.

На следующей иллюстрации показаны все явные и неявные преобразования типов данных, допустимые для системных типов данных SQL ServerSQL Server.The following illustration shows all explicit and implicit data type conversions that are allowed for SQL ServerSQL Server system-supplied data types. Это могут быть типы xml, bigint и sql_variant.These include xml, bigint, and sql_variant. При присваивании неявного преобразования из типа sql_variant не происходит, но неявное преобразование в тип sql_variant производится.There is no implicit conversion on assignment from the sql_variant data type, but there is implicit conversion to sql_variant.

Таблица преобразования типов данныхData type conversion table

Хотя на приведенной выше диаграмме показаны все явные и неявные преобразования, которые допускаются в SQL Server, в ней не указан результирующий тип данных.While the above chart illustrates all the explicit and implicit conversions that are allowed in SQL Server, it does not indicate the resulting data type of the conversion. Когда SQL Server выполняет явное преобразование, сам оператор определяет результирующий тип данных.When SQL Server performs an explicit conversion, the statement itself determines the resulting data type. Для неявных преобразований операторы назначения, такие как установка значения переменной или вставка значения в столбец, дают в результате тип данных, определенный в объявлении переменной или в определении столбца.For implicit conversions, assignment statements such as setting the value of a variable or inserting a value into a column result in the data type that was defined by the variable declaration or column definition. Для операторов сравнения или других выражений результирующий тип данных зависит от правил приоритета типов данных.For comparison operators or other expressions, the resulting data type depends on the rules of data type precedence.

Например, следующий сценарий определяет переменную типа varchar, присваивает переменной значение типа int, а затем выбирает объединение переменной со строкой.As an example, the following script defines a variable of type varchar, assigns an int type value to the variable, then selects a concatenation of the variable with a string.

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

Значение int``1 преобразуется в varchar, поэтому оператор SELECT возвращает значение 1 is a string..The int value of 1 is converted to a varchar, so the SELECT statement returns the value 1 is a string..

В следующем примере показан похожий сценарий с переменной int:The following example, shows a similar script with an int variable instead:

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

В этом случае оператор SELECT выдает следующую ошибку:In this case, the SELECT statement throws the following error:

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

Чтобы вычислить выражение @notastring + ' is not a string.', SQL Server следует правилам приоритета типов данных для выполнения неявного преобразования перед вычислением результата выражения.In order to evaluate the expression @notastring + ' is not a string.', SQL Server follows the rules of data type precedence to complete the implicit conversion before the result of the expression can be calculated. Поскольку int имеет более высокий приоритет, чем varchar, SQL Server пытается преобразовать строку в целое число, и операция завершается ошибкой, так как эта строка не может быть преобразована в целое число.Because int has a higher precedence than varchar, SQL Server attempts to convert the string to an integer and fails because this string cannot be converted to an integer. Если выражение содержит строку, которую можно преобразовать, работа оператора завершается успешно, как показано в следующем примере:If the expression provides a string that can be converted, the statement succeeds, as in the following example:

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

В этом случае строка 1 может быть преобразована в целочисленное значение 1, поэтому оператор SELECT возвращает значение 2.In this case, the string 1 can be converted to the integer value 1, so this SELECT statement returns the value 2. Обратите внимание, что оператор + выполняет сложение, а не объединение, если предоставленные типы данных являются целыми числами.Note that the + operator becomes addition rather than concatenation when the data types provided are integers.

Поведение преобразования типов данныхData type conversion behaviors

Некоторые виды явного и неявного преобразования типов данных не поддерживаются при преобразовании типа данных одного объекта SQL ServerSQL Server в тип данных другого объекта.Some implicit and explicit data type conversions are not supported when you are converting the data type of one SQL ServerSQL Server object to another. Например, значение типа nchar нельзя преобразовать в значение типа image.For example, an nchar value cannot be converted to an image value. Тип данных nchar можно преобразовать в тип данных binary только явно. Неявное преобразование в binary не поддерживается.An nchar can only be converted to binary by using explicit conversion, an implicit conversion to binary is not supported. Однако тип данных nchar можно преобразовать в тип nvarchar как явно, так и неявно.However, an nchar can be explicitly or implicitly converted to nvarchar.

В следующих подразделах приведено описание процесса преобразования следующих типов данных:The following topics describe the conversion behaviors exhibited by their corresponding data types:

Преобразование типов данных с помощью хранимых процедур OLE-автоматизацииConverting Data Types by Using OLE Automation Stored Procedures

Поскольку SQL ServerSQL Server использует типы данных Transact-SQLTransact-SQL, а OLE-автоматизация — типы данных Visual BasicVisual Basic, хранимым процедурам OLE-автоматизации приходится преобразовывать данные, которыми они обмениваются.Because SQL ServerSQL Server uses Transact-SQLTransact-SQL data types and OLE Automation uses Visual BasicVisual Basic data types, the OLE Automation stored procedures must convert the data that passes between them.

В следующей таблице описываются преобразования типов данных SQL ServerSQL Server в типы данных Visual BasicVisual Basic.The following table describes SQL ServerSQL Server to Visual BasicVisual Basic data type conversions.

Тип данных SQL ServerSQL Server data type Тип данных в Visual BasicVisual Basic data type
char, varchar, text, nvarchar, ntextchar, varchar, text, nvarchar, ntext StringString
decimal, numericdecimal, numeric StringString
bitbit BooleanBoolean
binary, varbinary, imagebinary, varbinary, image Одномерный массив Byte()One-dimensional Byte() array
intint LongLong
smallintsmallint Целое числоInteger
tinyinttinyint ByteByte
floatfloat DoubleDouble
realreal SingleSingle
money, smallmoneymoney, smallmoney ВалютаCurrency
datetime, smalldatetimedatetime, smalldatetime ДатаDate
Все значения NULLAnything set to NULL Variant со значением NULLVariant set to Null

Все одиночные значения SQL ServerSQL Server преобразуются в одиночные значения Visual BasicVisual Basic, за исключением binary, varbinary и image.All single SQL ServerSQL Server values are converted to a single Visual BasicVisual Basic value with the exception of binary, varbinary, and image values. В Visual BasicVisual Basic эти значения преобразуются в одномерные массивы Byte().These values are converted to a one-dimensional Byte() array in Visual BasicVisual Basic. Этот массив имеет диапазон Byte( от 0 до length 1 ), где length — число байтов в значениях SQL ServerSQL Server binary, varbinary или image.This array has a range of Byte( 0 to length 1 ) where length is the number of bytes in the SQL ServerSQL Server binary, varbinary, or image values.

Ниже приведена таблица преобразования типов данных Visual BasicVisual Basic в типы данных SQL ServerSQL Server.These are the conversions from Visual BasicVisual Basic data types to SQL ServerSQL Server data types.

Тип данных в Visual BasicVisual Basic data type Тип данных SQL ServerSQL Server data type
Long, Integer, Byte, Boolean, ObjectLong, Integer, Byte, Boolean, Object intint
Double, SingleDouble, Single floatfloat
ВалютаCurrency moneymoney
ДатаDate datetimedatetime
String длиной 4000 символов или меньшеString with 4000 characters or less varchar/nvarcharvarchar/nvarchar
String длиной более 4000 символовString with more than 4000 characters text/ntexttext/ntext
Одномерный массив Byte() размером 8000 байт или меньшеOne-dimensional Byte() array with 8000 bytes or less varbinaryvarbinary
Одномерный массив Byte() размером более 8000 байтOne-dimensional Byte() array with more than 8000 bytes imageimage

См. такжеSee also

Хранимые процедуры OLE-автоматизации (Transact-SQL)OLE Automation Stored Procedures (Transact-SQL)
Функции CAST и CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
Типы данных (Transact-SQL)Data Types (Transact-SQL)
COLLATE (Transact-SQL)COLLATE (Transact-SQL)