Преобразование типов данных (компонент Database Engine)

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

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

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

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

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

    CAST ( $157.27 AS VARCHAR(10) )
    

    Если необходимо обеспечить совместимость программного кода на языке Transact-SQL со стандартом SQL-92, то вместо функции CONVERT используется функция CAST. Функция CONVERT используется вместо CAST благодаря широким функциональным возможностям при работе со стилями.

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

При обработке типа sql_variant SQL Server поддерживает неявное преобразование объектов других типов данных в тип sql_variant. Но SQL Server не поддерживает неявные преобразования типа sql_variant в объекты с другим типом данных.

Дополнительные сведения о поддерживаемых видах преобразования объектов SQL Server см. в разделе Функции CAST и CONVERT (Transact-SQL).

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

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

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

данных binary и varbinary

данных типа float и real

данных типа bit

данных типа money

символьных данных

данных типа decimal и numeric

данных типа datetime и smalldatetime

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

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

При преобразовании данных строкового типа (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext или image) в тип данных binary или varbinary неравной длины SQL Server дополняет или усекает данные справа. При преобразовании других типов данных в тип binary или varbinary данные дополняются или усекаются слева. Дополнение осуществляется шестнадцатеричными нулями.

Если для обмена данными лучше всего подходит тип binary, то другие типы данных удобнее всего будет преобразовать в binary или varbinary. Преобразование любого достаточно большого значения в двоичное и обратно всегда дает первоначальное значение, если оба преобразования выполняются в одной и той же версии SQL Server. Двоичное представление значения может меняться в зависимости от версии SQL Server.

Типы данных int, smallint и tinyint можно преобразовать в тип binary или varbinary, но если преобразовать значение binary обратно в целочисленное, то оно будет отличаться от исходного в случае усечения. Например, в следующей инструкции SELECT показано, что целочисленное значение 123456 обычно хранится как двоичное 0x0001e240:

SELECT CAST( 123456 AS BINARY(4) )

Однако в следующей инструкции SELECT показано, что если целевой тип binary слишком мал для хранения всего значения, то начальные цифры неявно усекаются и то же самое число хранится как 0xe240:

SELECT CAST( 123456 AS BINARY(2) )

В следующем пакете показано, что это необъявленное усечение может повлиять на арифметические операции без возникновения ошибки.

DECLARE @BinaryVariable2 BINARY(2)

SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1

SELECT CAST( @BinaryVariable2 AS INT)
GO

Окончательный результат - 57921, но не 123457.

ms191530.note(ru-ru,SQL.90).gifПримечание.
Преобразование любого типа данных в binary может различаться в зависимости от версии SQL Server.

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

Преобразование в тип данных bit увеличивает любое ненулевое значение на 1.

Преобразование в символьные данные

При преобразовании символьного выражения в символьный тип данных другой длины значения, слишком длинные для нового типа данных, усекаются.

Если символьное выражение преобразуется в символьное выражение другого типа данных или размера, например из char(5) в varchar(5) или из char(20) в char(15), то преобразованному значению присваиваются параметры сортировки входного значения. Если несимвольное выражение преобразуется в символьный тип данных, то преобразованному значению присваиваются параметры сортировки, заданные по умолчанию в текущей базе данных. В любом случае необходимые параметры сортировки можно присвоить с помощью предложения COLLATE.

ms191530.note(ru-ru,SQL.90).gifПримечание.
Преобразование кодовых страниц поддерживается для типов данных char и varchar, однако поддержка типа данных text не предусмотрена. Как и в ранних версиях SQL Server, о потере данных во время преобразования кодовых страниц не сообщается.

Символьные выражения, которые преобразуются в приближенный тип данных numeric, могут содержать необязательную экспоненциальную нотацию (символ e нижнего регистра или E верхнего регистра, за которым следуют необязательный знак плюс (+) или минус (-) и число).

Символьные выражения, преобразуемые в точный тип данных numeric, должны состоять из цифр, десятичного разделителя и необязательного знака плюс (+) или минус (-). Начальные пробелы игнорируются. Разделители в виде запятой запрещены (например, десятичный разделитель в числе 123 456,00).

Кроме того, символьные выражения, преобразуемые в типы данных money или smallmoney, могут содержать необязательный десятичный разделитель и обозначение валюты. Разрешаются разделители в виде запятой, например 123 456,00 руб.

В следующем примере показан способ преобразования данных для вывода. Этот пример перед сравнением строк преобразует продажи в символьные данные и текущую дату в стиль 3, ДД/ММ/ГГ.

USE AdventureWorks;
GO
SELECT SalesPersonID,
   CAST(SalesYTD AS varchar(12)),
   CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%'
GO

В этом примере значение uniqueidentifier преобразуется в тип данных char.

DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char'
GO

В этом примере текущая дата преобразуется в стиль 3, ДД/ММ/ГГ.

SELECT CONVERT(char(12), GETDATE(), 3)
GO

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

При преобразовании в тип данных datetime SQL Server 2005 отвергает все значения, которые не удается распознать как даты. Сюда относятся даты до 1 января 1 года н.э. Значения типа datetime можно преобразовать в тип данных smalldatetime, если дата находится в допустимом диапазоне: с 1 января 1900 года по 6 июня 2079 года. Значение времени округляется до ближайших минут.

В следующем примере значения типа smalldatetime и datetime преобразуются соответственно в типы данных varchar и binary.

DECLARE @mydate_sm smalldatetime
SET @mydate_sm = '4/05/98'

SELECT CAST(@mydate_sm AS varchar) AS SM_DATE_VARCHAR
GO

DECLARE @mydate  datetime
SET @mydate     = '4/05/98'

SELECT  CAST(@mydate AS binary) AS DATE_BINARY
GO

Ниже приводится результирующий набор.

(1 row(s) affected)

SM_DATE_VARCHAR                
------------------------------ 
Apr  5 1998 12:00AM            

(1 row(s) affected)

DATE_BINARY                                                    
-------------------------------------------------------------- 
0x0000000000000000000000000000000000000000000000008c3000000000 

(1 row(s) affected)

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

Значения типа float усекаются, если они преобразуются в любой целочисленный тип данных.

Если тип данных float или real нужно преобразовать в символьный тип, то, как правило, строковую функцию STR использовать удобнее, чем CAST( ). Это объясняется большими возможностями функции STR в отношении форматирования. Дополнительные сведения см. в разделах STR (Transact-SQL) и Функции (Transact-SQL).

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

При преобразовании целочисленного типа данных в тип money предполагаются денежные единицы. Например, целочисленное значение 4 преобразуется в значение типа данных money величиной 4 денежные единицы.

В следующем примере значения типов smallmoney и money преобразуются соответственно в типы данных varchar и decimal.

USE AdventureWorks;
GO
DECLARE @mymoney_sm smallmoney;
SET  @mymoney_sm = 3148.29;
SELECT  CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney    money;
SET  @mymoney    = 3148.29;
SELECT  CAST(@mymoney AS decimal)    AS 'MONEY DECIMAL';

GO

Ниже приводится результирующий набор.

SM_MONEY VARCHAR               
------------------------------ 
3148.29                        

(1 row(s) affected)

MONEY DECIMAL          
---------------------- 
3148                   

(1 row(s) affected)

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

Для типов данных decimal и numeric SQL Server обрабатывает каждую конкретную комбинацию точности и масштаба как разные типы данных. Например, значения decimal(5,5) и decimal(5,0) считаются разными типами данных.

В инструкциях Transact-SQL константа с десятичным разделителем автоматически преобразуется в значение типа данных numeric с минимально необходимой точностью и масштабом. Например, константа 12 345 преобразуется в значение numeric с точностью 5 и масштабом 3.

Преобразование типа данных decimal или numeric в тип float или real может привести к потере точности. Преобразование типов данных int, smallint, tinyint, float, real, money или smallmoney в тип decimal или numeric может вызвать переполнение.

По умолчанию SQL Server использует округление с потерей точности и масштаба при преобразовании числа в значение decimal или numeric. Однако при включенном (ON) параметре SET ARITHABORT в случае переполнения SQL Server вызывает ошибку. Для возникновения ошибки недостаточно только потери точности и масштаба.

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

Integer

tinyint

Byte

float

Double

real

Single

money, smallmoney

Currency

datetime, smalldatetime

Date

Все значения NULL

Тип данных Variant со значением Null

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

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

Тип данных Visual Basic Тип данных SQL Server

Long, Integer, Byte, Boolean, Object

int

Double, Single

float

Currency

money

Date

datetime

String длиной 4000 символов или меньше

varchar/nvarchar

String длиной более 4000 символов

text/ntext

Одномерный массив Byte() размером 8 000 байт или меньше

varbinary

Одномерный массив Byte() размером более 8 000 байт

image

См. также

Основные понятия

Перенос данных в программные переменные

Другие ресурсы

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

Справка и поддержка

Получение помощи по SQL Server 2005