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

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в Microsoft Fabric

Преобразование типов данных происходит в следующих случаях:

  • При перемещении, сравнении или объединении данных одного объекта с данными другого объекта эти данные могут преобразовываться из одного типа в другой.
  • При передаче в переменную программы данных из результирующего столбца Transact-SQL, кода возврата или параметра вывода эти данные должны преобразовываться из системного типа данных SQL Server в тип данных переменной.

При преобразовании между переменной приложения и столбцом результирующих наборов SQL Server, возвращаемым кодом, параметром или маркером параметров поддерживаемые преобразования типов данных определяются API базы данных.

Явное и неявное преобразование

Преобразование типов данных бывает явным и неявным.

Неявное преобразование скрыто от пользователя. SQL Server автоматически преобразует данные из одного типа данных в другой. Например, если smallint сравнивается с int, то перед сравнением smallint неявно преобразуется в int.

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

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

Функции CAST и CONVERT преобразуют значение (локальную переменную, столбец или выражение) из одного типа данных в другой. Например, приведенная ниже функция CAST преобразует числовое значение $157.27 в строку символов '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Если программный код Transact-SQL должен соответствовать требованиям ISO, используйте функцию CAST вместо CONVERT. Использование функции CONVERT вместо CAST дает преимущество в дополнительной функциональности.

На следующем рисунке показаны все явные и неявные преобразования типов данных, которые разрешены для системных типов данных SQL Server. Это могут быть типы xml, bigint и sql_variant. При присваивании неявного преобразования из типа sql_variant не происходит, но неявное преобразование в тип sql_variant производится.

Data type conversion table

Хотя на приведенной выше диаграмме показаны все явные и неявные преобразования, которые допускаются в SQL Server, в ней не указан результирующий тип данных. Когда SQL Server выполняет явное преобразование, сам оператор определяет результирующий тип данных. Для неявных преобразований операторы назначения, такие как установка значения переменной или вставка значения в столбец, дают в результате тип данных, определенный в объявлении переменной или в определении столбца. Для операторов сравнения или других выражений результирующий тип данных зависит от правил приоритета типов данных.

Например, следующий сценарий определяет переменную типа varchar, присваивает переменной значение типа int, а затем выбирает объединение переменной со строкой.

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

Значение int1 преобразуется в varchar, поэтому оператор SELECT возвращает значение 1 is a string..

В следующем примере показан похожий сценарий с переменной int:

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

В этом случае оператор SELECT выдает следующую ошибку:

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 следует правилам приоритета типов данных для выполнения неявного преобразования перед вычислением результата выражения. Поскольку int имеет более высокий приоритет, чем varchar, SQL Server пытается преобразовать строку в целое число, и операция завершается ошибкой, так как эта строка не может быть преобразована в целое число. Если выражение содержит строку, которую можно преобразовать, работа оператора завершается успешно, как показано в следующем примере:

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

В этом случае строка 1 может быть преобразована в целочисленное значение 1, поэтому оператор SELECT возвращает значение 2. Обратите внимание, что оператор + выполняет сложение, а не объединение, если предоставленные типы данных являются целыми числами.

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

Некоторые неявные и явные преобразования типов данных не поддерживаются при преобразовании типа данных одного объекта SQL Server в другой. Например, значение типа nchar нельзя преобразовать в значение типа image. Тип данных nchar можно преобразовать в тип данных binary только явно. Неявное преобразование в binary не поддерживается. Однако тип данных nchar можно преобразовать в тип nvarchar как явно, так и неявно.

В следующих темах приведено описание процесса преобразования следующих типов данных:

Преобразование типов данных с помощью хранимых процедур OLE-автоматизации

Поскольку SQL Server использует типы данных Transact-SQL, а служба автоматизации OLE — типы данных Visual Basic, хранимым процедурам службы автоматизации OLE приходится преобразовывать данные, которыми они обмениваются.

В следующей таблице описаны преобразования типов данных SQL Server в Visual Basic.

Тип данных SQL Server Тип данных Visual Basic
char, varchar, text, nvarchar, ntext String
decimal, numeric String
bit Boolean
binary, varbinary, image Одномерный массив Byte()
int Long
smallint Целое число
tinyint Byte
float Двойной
real Один
money, smallmoney Валюта
datetime, smalldatetime Дата
Все значения NULL Variant со значением NULL

Все значения SQL Server преобразуются в одно значение Visual Basic, за исключением двоичных, varbinary и изображений. Эти значения преобразуются в одномерный массив Byte() в Visual Basic. Этот массив имеет диапазон байт ( от 0 до длины 1**)**, где длина — количество байтов в значениях binary, varbinary или image SQL Server.

Это преобразования типов данных Visual Basic в типы данных SQL Server.

Тип данных Visual Basic Тип данных SQL Server
Long, Integer, Byte, Boolean, Object int
Double, Single float
Валюта money
Дата datetime
String длиной 4000 символов или меньше varchar/nvarchar
String длиной более 4000 символов text/ntext
Одномерный массив Byte() размером 8000 байт или меньше varbinary
Одномерный массив Byte() размером более 8000 байт Изображение

См. также

Хранимые процедуры OLE Automation (Transact-SQL)
CAST и CONVERT (Transact-SQL)
Типы данных (Transact-SQL)
COLLATE (Transact-SQL)