Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Azure Synapse Analytics
Система платформы аналитики (PDW)
Конечная точка SQL аналитики в Microsoft Fabric
Хранилище в Microsoft Fabric
База данных SQL в 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.'
Значение 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 можно преобразовать только в двоичный файл с помощью явного преобразования. Неявное преобразование в двоичный файл не поддерживается. Однако тип данных 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 |
| Десятичный, числовой | String |
| bit | Boolean |
| бинарный, варбинарный, изображение | Одномерный Byte() массив |
| int | Long |
| smallint | Integer |
| tinyint | Byte |
| float | Double |
| real | Single |
| деньги, маленькие деньги | Currency |
| datetime, smalldatetime | Date |
Все, что задано для 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 |
|---|---|
| Длинный, целочисленный, байт, булевый, объектный | int |
| Двойной, одноместный | float |
| Currency | money |
| Date | datetime |
| Строка с 4000 символами или меньше | Варчар/Нварчар |
| Строка с более чем 4000 символами | СМС/ntext |
Одномерный Byte() массив с 8000 байтами или меньше |
varbinary |
Одномерный Byte() массив с более чем 8000 байтами |
image |