Работа с типами данных
Столбцы и переменные, используемые в 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
...
...