Работа с типами данных

Завершено

Столбцы и переменные, используемые в Transact-SQL, имеют тип данных. Поведение значений в выражениях зависит от типа данных столбца или переменной, на которую указывает ссылка. Например, как было показано ранее, оператор + можно использовать для сцепления двух строковых значений или для сложения двух числовых значений.

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

Точное числовое значение

приблизительное числовое значение

Символ

Дата и время

Binary

Другие

tinyint

с плавающей запятой

char

Дата

binary

курсор

smallint

real

varchar

Время

varbinary

hierarchyid

INT

text

datetime

Изображение

sql_variant

bigint

nchar

datetime2

table

bit

nvarchar

smalldatetime

TIMESTAMP

десятичное/числовое значение

ntext

datetimeoffset

uniqueidentifier

numeric

xml

money

география

smallmoney

geometry

Примечание.

Дополнительные сведения о различных типах данных и их атрибутах см. в справочной документации по Transact-SQL.

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

При необходимости значения совместимых типов данных можно неявно преобразовать. Например, можно использовать оператор + для добавления целочисленного значения к десятичному или для сцепления значения char фиксированной длины и значения переменной длины varchar. Однако в некоторых случаях может потребоваться явное преобразование значений из одного типа данных в другой. Например, попытка использовать + для сцепления значений varchar и decimal приведет к ошибке, если сначала не преобразовать числовое значение в совместимый строковый тип данных.

Примечание.

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

Функции T-SQL для явного преобразования типов данных

CAST и TRY_CAST

Функция CAST преобразует значение в указанный тип данных, если значение совместимо с целевым типом данных. Если они несовместимы, функция вернет ошибку.

Например, следующий запрос использует CAST для преобразования целочисленных значений в столбце ProductID в значения varchar (не более 4 символов), чтобы объединить их с другим символьным значением:

SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;

Возможные результаты этого запроса могут выглядеть примерно так:

НаименованиеПродукта

680: HL Road Frame - Black, 58

706: HL Road Frame - Red, 58

707: Sport-100 Helmet, Red

708: Sport-100 Helmet, Black

...

Однако предположим, что столбец Size в таблице Production.Product является столбцом типа nvarchar (переменная длина, текстовые данные в формате Юникода), который содержит числовые значения размеров (например, 58) и текстовые значения размеров (например, "S", "M" или "L"). Следующий запрос пытается преобразовать значения из этого столбца в тип данных integer:

SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;

Этот запрос приведет к следующему сообщению об ошибке:

Error: Conversion failed when converting the nvarchar value 'M' to data type int. (Ошибка: не удалось выполнить преобразование значения nvarchar "m" в тип данных int.)

Учитывая, что по крайней мере некоторые значения в столбце являются числовыми, может потребоваться преобразовать эти значения и игнорировать другие. Для преобразования типов данных можно использовать функцию TRY_CAST.

SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;

Результаты на этот раз могут выглядеть следующим образом:

NumericSize

58

58

NULL

NULL

...

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

Примечание.

Вопросы обработки значений NULL будут рассмотрены позднее.

CONVERT и TRY_CONVERT

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

SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;

Опять же, этот запрос возвращает значение, преобразованное в указанный тип данных, следующим образом:

НаименованиеПродукта

680: HL Road Frame - Black, 58

706: HL Road Frame - Red, 58

707: Sport-100 Helmet, Red

708: Sport-100 Helmet, Black

...

Как и в CAST, CONVERT имеет вариант TRY_CONVERT, возвращающий значение NULL для несовместимых значений.

Еще одно преимущество использования CONVERT по сравнению с CAST заключается в том, что у CONVERT есть параметр, который позволяет указать стиль форматирования при преобразовании числовых значений и дат в строки. Например, рассмотрим следующий запрос:

SELECT SellStartDate,
       CONVERT(varchar(20), SellStartDate) AS StartDate,
       CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate 
FROM SalesLT.Product;

Результаты этого запроса могут выглядеть примерно так:

SellStartDate

StartDate

FormattedStartDate

2002-06-01T00:00:00.0000000

Jun 1 2002 12:00AM

6/1/2002

2002-06-01T00:00:00.0000000

Jun 1 2002 12:00AM

6/1/2002

2005-07-01T00:00:00.0000000

Jul 1 2005 12:00AM

1.7.2005

2005-07-01T00:00:00.0000000

Jul 1 2005 12:00AM

1.7.2005

...

...

...

Примечание.

Дополнительные сведения о кодах стилей форматирования, которые можно использовать с инструкцией CONVERT, см. в справочной документации по Transact-SQL.

PARSE и TRY_PARSE

Функция PARSE предназначена для преобразования форматированных строк, представляющих числовые значения или значения даты и времени. Например, рассмотрим следующий запрос (в котором используются литеральные значения, а не значения из столбцов в таблице):

SELECT PARSE('01/01/2021' AS date) AS DateValue,
   PARSE('$199.99' AS money) AS MoneyValue;

Результаты этого запроса выглядят следующим образом:

DateValue

MoneyValue

2021-01-01T00:00:00.0000000

199.99

Аналогично CAST и CONVERT, для PARSE есть вариант TRY_PARSE, возвращающий несовместимые значения как NULL.

Примечание.

При работе с типами данных decimal и numeric может понадобиться округление до целого числа или задание десятичной запятой, что можно указать с помощью аргументов precision (точность) и scale (масштаб). Более подробные сведения об аргументах precision и scale см. в справочной документации по Transact-SQL.

STR

Функция STR преобразует числовое значение в тип varchar.

Например:

SELECT ProductID,  '$' + STR(ListPrice) AS Price
FROM Production.Product;

Результат будет иметь следующий вид:

ProductID

Цена,

680

1432,00 долларов США

706

1432,00 долларов США

707

$35,00

...

...