数据类型转换(数据库引擎)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库 Microsoft Fabric SQL 数据库
在以下情况下,可以转换数据类型:
- 当一个对象的数据移到另一个对象,或两个对象之间的数据进行比较或组合时,数据可能必须从一个对象的数据类型转换为另一个对象的数据类型。
- 将 TransactSQL 结果列、返回代码或输出参数中的数据移到某个程序变量中时,必须将这些数据从 SQL Server 系统数据类型转换成该变量的数据类型。
在应用程序变量与 SQL Server 结果集列、返回代码、参数或参数标记之间进行转换时,支持的数据类型转换由数据库 API 定义。
隐式和显式转换
可以隐式或显式转换数据类型。
隐式转换对用户不可见。 SQL Server 会自动将数据从一种数据类型转换为另一种数据类型。 例如,将 smallint 与 int 进行比较时,在比较之前,smallint 会被隐式转换为 int。
GETDATE()
隐式转换为日期样式0
。 SYSDATETIME()
隐式转换为日期样式 21
。
显式转换使用 CAST
或 CONVERT
函数。
CAST 和 CONVERT 函数可将值(局部变量、列或其他表达式)从一种数据类型转换为另一种数据类型。 例如,以下 CAST
函数可将数值 $157.27
转换为字符串 '157.27'
:
CAST ( $157.27 AS VARCHAR(10) )
如果希望 Transact-SQL 程序代码符合 ISO 标准,请使用 CAST
而不要使用 CONVERT
。 如果要利用 CONVERT
中的样式功能,请使用 CAST
而不要使用 CONVERT
。
以下图例显示了可对 SQL Server 系统提供的数据类型执行的所有显式和隐式数据类型转换。 这些包括 xml、bigint 和sql_variant。 不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换 。
虽然前面的图表说明了 SQL Server 中允许的所有显式和隐式转换,但并未指出转换的结果数据类型。
- 当 SQL Server 执行显式转换时,语句本身会确定结果数据类型。
- 对于隐式转换,赋值语句(例如设置变量的值或在列中插入值)将产生由变量声明或列定义所定义的数据类型。
- 对于比较运算符或其他表达式,结果数据类型取决于数据类型优先级的规则。
例如,以下脚本定义一个类型为 varchar 的变量,将 int 类型值赋给该变量,然后选择该变量与字符串的串联。
DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'
1
的 int 值会转换为 varchar,因此 SELECT
语句返回值 1 is a string.
。
下面的示例演示改为使用 int 变量的类似脚本:
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.'
在此例中,SELECT
语句会引发以下错误:
Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.
为了计算表达式 @notastring + ' is not a string.'
,SQL Server 先遵循数据类型优先级的规则来完成隐式转换,然后才能计算表达式的结果。 由于 int 的优先级高于 varchar,SQL Server 会尝试将字符串转换为整数,但是会失败,因为此字符串无法转换为整数。 如果表达式提供可以转换的字符串,则该语句会成功,如以下示例所示:
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'
在此例中,字符串 1
可以转换为整数值 1
,因而此 SELECT
语句会返回值 2
。 当提供的数据类型为整数时,+
运算符会成为加法而不是串联。
数据类型转换行为
将一个 SQL Server 对象的数据类型转换为另一种数据类型时,不支持某些隐式和显式数据类型转换。 例如,nchar 值无法被转换为 image 值。 只能使用显式转换将 nchar 转换为 binary。 不支持使用隐式方法转换为 binary。 但是,nchar 既可以显式也可以隐式转换为 nvarchar。
以下各文章说明对应数据类型展示的转换行为:
- binary 和 varbinary
- datetime2
- money 和 smallmoney
- bit
- datetimeoffset
- smalldatetime
- char 和 varchar
- decimal 和 numeric
- sql_variant
- date
- float 和 real
- time
- datetime
- int、bigint、smallint 和 tinyint
- uniqueidentifier
- xml
- json
使用 OLE 自动化存储过程转换数据类型
由于 SQL Server 使用 Transact-SQL 数据类型,而 OLE 自动化使用 Visual Basic 数据类型,因此 OLE 自动化存储过程必须转换在两者之间传递的数据。
下表说明了从 SQL Server 到 Visual Basic 的数据类型转换。
SQL Server 数据类型 | Visual Basic 数据类型 |
---|---|
char、varchar、text、nvarchar、ntext | 字符串 |
decimal、numeric | 字符串 |
bit | 布尔值 |
binary、varbinary、image | 一维 Byte() 数组 |
int | Long |
smallint | 整数 |
tinyint | Byte |
float | 双精度 |
real | 单精度 |
money、 smallmoney | 货币 |
datetime、smalldatetime | 日期 |
设置为 NULL 的任意内容 |
Variant 设置为 Null |
除了 binary、varbinary 和 image 值以外,所有单个 SQL Server 值都被转换为单个 Visual Basic 值。 这些值将被转换为 Visual Basic 中的一维 Byte()
数组。 此数组的范围为 Byte( 0 to length 1)
,其中 length 是 SQL Server binary、varbinary 或 image 值中的字节数。
以下是从 Visual Basic 数据类型到 SQL Server 数据类型的转换。
Visual Basic 数据类型 | SQL Server 数据类型 |
---|---|
Long、Integer、Byte、Boolean、Object | int |
Double、Single | float |
货币 | money |
日期 | datetime |
小于或等于 4,000 个字符的 String | varchar/nvarchar |
大于 4,000 个字符的 String | text/ntext |
小于或等于 8,000 字节的一维 Byte() 数组 |
varbinary |
大于 8,000 字节的一维 Byte() 数组 |
image |