使用数据类型
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
...
...