使用数据类型

已完成

Transact-SQL 中使用的列和变量都具有数据类型。 表达式中值的行为取决于所引用的列或变量的数据类型。 例如,如前面所示,可以使用 + 运算符连接两个字符串值,或添加两个数值。

下表显示了 SQL Server 数据库中通常支持的数据类型。

精确数值

近似数值

字符

日期/时间

二进制

其他

tinyint

FLOAT

char

date

binary

cursor

smallint

real

varchar

time

varbinary

hierarchyid

int

text

datetime

image

sql_variant

bigint

nchar

datetime2

bit

nvarchar

smalldatetime

timestamp

十进制/数值

ntext

datetimeoffset

uniqueidentifier

numeric

xml

money

geography

smallmoney

geometry

注意

有关不同数据类型及其属性的详细信息,请访问 Transact-SQL 参考文档

数据类型转换

兼容的数据类型值可按要求隐式转换。 例如,假设可以使用 + 运算符向十进制数添加整数,或连接固定长度的 char 值和可变长度的 varchar 值。 但是,在某些情况下,可能需要将值从一种数据类型显式转换为另一种数据类型 - 例如,尝试使用 + 连接 varchar 值和十进制值将会出错,除非先将数值转换为兼容的字符串数据类型。

备注

隐式和显式转换适用于某些数据类型,有些转换是不可能的。 有关详细信息,请使用 Transact-SQL 参考文档中的图表。

T-SQL 包含有助于显式转换数据类型的函数

CAST 和 TRY_CAST

CAST 函数可将值转换为指定的数据类型,但该值必须与目标数据类型兼容。 如果不兼容,将返回错误。

例如,以下查询使用 CAST 将 ProductID 列中的整数值转换为 varchar 值(最多为 4 个字符),以便将它们与其他基于字符的值连接:

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

该查询的结果可能如下所示:

ProductName

680:HL 公路车架 - 黑色,58

706:HL 公路车架 - 红色,58

707:Sport-100 头盔,红色

708:Sport-100 头盔,黑色

...

但是,假设 Production.Product 表中的“大小”列是 nvarchar(可变长度,Unicode 文本数据)列,其中包含一些数值大小(例如 58)和一些基于文本的大小(例如“S”、“M”或“L”)。 以下查询尝试将此列中的值转换为“整数”数据类型:

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

该查询将导致以下错误消息:

错误:将 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 是 ANSI 标准 SQL 函数,用于转换数据类型,适用于许多数据库系统。 在 Transact-SQL 中还可以使用 CONVERT 函数,如下所示:

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

同样,此查询将返回转换为指定数据类型的值,如下所示:

ProductName

680:HL 公路车架 - 黑色,58

706:HL 公路车架 - 红色,58

707:Sport-100 头盔,红色

708:Sport-100 头盔,黑色

...

同 CAST 一样,CONVERT 包含 TRY_CONVERT 变量,对于不兼容的值将返回 NULL。

相比 CAST,使用 CONVERT 的另一点好处是 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

Jun 1 2002 12:00AM

6/1/2002

2002-06-01T00:00:00

Jun 1 2002 12:00AM

6/1/2002

2005-07-01T00:00:00

Jul 1 2005 12:00AM

2005/7/1

2005-07-01T00:00:00

Jul 1 2005 12:00AM

2005/7/1

...

...

...

注意

要了解对于 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

199.99

同 CAST 和 CONVERT 类似,PARSE 包含一个 TRY_PARSE 变量,对于不兼容的值将返回 NULL。

注意

处理小数或数字数据类型时,可能需要舍入到整数或设置小数点,这可以通过精准率和小数位数实现。 要更好地了解精准率和小数位数的概念,请参阅 Transact-SQL 参考文档

STR

STR 函数可将数值转换为 varchar。

例如:

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

结果将如下所示:

ProductID

价格

680

$1432.00

706

$1432.00

707

$35.00

...

...