Преобразование типов данных (ядро СУБД)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в 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) )
Используйте CAST
вместо того, CONVERT
чтобы код программы Transact-SQL соответствовал ISO. Используйте CONVERT
вместо CAST
того, чтобы воспользоваться преимуществами функций стиля в CONVERT
.
На следующем рисунке показаны все явные и неявные преобразования типов данных, которые разрешены для системных типов данных SQL Server. Это могут быть типы xml, bigint и sql_variant. При присваивании неявного преобразования из типа sql_variant не происходит, но неявное преобразование в тип sql_variant производится.
Хотя на предыдущей диаграмме показаны все явные и неявные преобразования, разрешенные в SQL Server, он не указывает результирующий тип данных преобразования.
- Когда SQL Server выполняет явное преобразование, сам оператор определяет результирующий тип данных.
- Для неявных преобразований операторы назначения, такие как установка значения переменной или вставка значения в столбец, дают в результате тип данных, определенный в объявлении переменной или в определении столбца.
- Для операторов сравнения или других выражений результирующий тип данных зависит от правил приоритета типа данных.
Например, следующий скрипт определяет переменную типа varchar, назначает значение типа int переменной, а затем выбирает объединение переменной со строкой.
DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'
Значение int 1
преобразуется в 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 можно преобразовать только в двоичный файл с помощью явного преобразования. Неявное преобразование в двоичный файл не поддерживается. Однако тип данных nchar можно преобразовать в тип nvarchar как явно, так и неявно.
В следующих статьях описывается поведение преобразования, представленное соответствующими типами данных:
- binary и varbinary
- datetime2
- money и smallmoney
- bit
- datetimeoffset
- smalldatetime
- char и varchar
- decimal и numeric
- sql_variant
- date
- float и real
- time
- datetime
- int, bigint, smallint и tinyint
- uniqueidentifier
- xml
- json
Преобразование типов данных с помощью хранимых процедур OLE Automation
Поскольку 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. Этот массив содержит диапазонByte( 0 to length 1)
, в котором длина — это количество байтов в двоичном файле SQL Server, varbinary или значения изображения.
Это преобразования типов данных Visual Basic в типы данных SQL Server.
Тип данных Visual Basic | Тип данных SQL Server |
---|---|
Long, Integer, Byte, Boolean, Object | int |
Double, Single | float |
Валюта | money |
Дата | datetime |
Строка с 4000 символами или меньше | varchar/nvarchar |
Строка с более чем 4000 символами | text/ntext |
Одномерный Byte() массив с 8000 байтами или меньше |
varbinary |
Одномерный Byte() массив с более чем 8000 байтами |
Изображение |