数据类型转换(数据库引擎)
在以下情况下,可以转换数据类型:
当一个对象的数据移到另一个对象,或两个对象之间的数据进行比较或组合时,数据可能必须从一个对象的数据类型转换为另一个对象的数据类型。
将 Transact-SQL 结果列、返回代码或输出参数中的数据移到某个程序变量中时,必须将这些数据从 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 中的样式功能,请使用 CONVERT 而不要使用 CAST。
以下图例显示了可对 SQL Server 系统提供的数据类型执行的所有显式和隐式数据类型转换。 其中包括 xml、bigint 和 sql_variant。 不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换。
数据类型转换行为
将一个 SQL Server 对象的数据类型转换为另一种数据类型时,不支持某些隐式和显式数据类型转换。 例如,nchar 值无法被转换为 image 值。 nchar 只能显式转换为 binary,而不支持隐式转换为 binary。 但是,nchar 既可以显式也可以隐式转换为 nvarchar。
以下各主题说明各对应数据类型展示的转换行为:
使用 OLE 自动化存储过程转换数据类型
由于 SQL Server 使用 Transact-SQL 数据类型,而 OLE 自动化使用 Visual Basic 数据类型,因此 OLE 自动化存储过程必须转换在两者之间传递的数据。
下表说明了从 SQL Server 到 Visual Basic 的数据类型转换。
SQL Server 数据类型 |
Visual Basic 数据类型 |
---|---|
char、varchar、text、 nvarchar、ntext |
String |
decimal、numeric |
String |
bit |
Boolean |
binary、varbinary、image |
一维 Byte() 数组 |
int |
Long |
smallint |
Integer |
tinyint |
Byte |
float |
Double |
real |
Single |
money、smallmoney |
Currency |
datetime、smalldatetime |
Date |
设置为 NULL 的任何类型 |
设置为 Null 的 Variant |
除了 binary、varbinary 和 image 值以外,所有单个 SQL Server 值都被转换为单个 Visual Basic 值。 这些值将被转换为 Visual Basic 中的一维 Byte() 数组。 此数组的范围为 Byte(0 到 length1),其中 length 是 SQL Server binary、varbinary 或 image 值中的字节数。
以下是从 Visual Basic 数据类型到 SQL Server 数据类型的转换。
Visual Basic 数据类型 |
SQL Server 数据类型 |
---|---|
Long、Integer、Byte、Boolean、Object |
int |
Double、Single |
float |
Currency |
money |
Date |
datetime |
小于或等于 4000 个字符的 String |
varchar/nvarchar |
大于 4000 个字符的 String |
text/ntext |
小于或等于 8000 字节的一维 Byte() 数组 |
varbinary |
大于 8000 字节的一维 Byte() 数组 |
image |