Поделиться через


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

Применимо к: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) )  

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

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

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

Хотя на предыдущей диаграмме показаны все явные и неявные преобразования, разрешенные в 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 как явно, так и неявно.

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

Преобразование типов данных с помощью хранимых процедур 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 байтами Изображение