SQL Server数据类型转换方法

在sql server日常的函数、存储过程和sql语句中,经常会用到不同数据类型的转换。在sql server有两种数据转换类型:一种是显性数据转换;另一种是隐性数据转换。下面分别对这两种数据类型转换进行简要的说明:

1 显式转换

显示转换是将某种数据类型的表达式显式转换为另一种数据类型。常用的是cast 和 convert 函数。

 cast: cast ( expression as data_type )
 convert: convert (data_type[(length)], expression [, style])

参数 expression 是任何有效的 microsoft sql server表达式。data_type 目标系统所提供的数据类型,不能使用用户定义的数据类型。

2 隐性转换

隐性转换对于用户是不可见的,由sql server 引擎自动处理。 隐性转换自动将数据从一种数据类型转换成另一种数据类型。例如,如果一个 smallint 变量和一个 int 变量相比较,这个 smallint 变量在比较前即被隐性转换成 int 变量。 当从一个 sql server 对象的数据类型向另一个转换时,一些隐性和显式数据类型转换是不支持的。例如,nchar 数值根本就不能被转换成 image 数值。nchar 只能显式地转换成 binary,隐性地转换到 binary 是不支持的。nchar 可以显式地或者隐性地转换成 nvarchar。

3 隐性转换的风险

隐性转换有的时候非常方便,可以简化sql 脚本,但是这里面也孕育着潜在的风险,可能会出现在脚本一开始运行的时候都是正常的,但却某一个时间点之后,程序莫名出现错误。下面举一个现实项目中的例子来说明。在sql server 2008中有一个表,需要从两个不同的数据表中拉取数据,由于这两个数据表属于不同的系统,其主键类型是不同的,一个是int类型,一个是guid,一开始想着这两个都可以转换成字符类型进行存储。所以就在表中建立一个nvarchar(50)的混合id列作为主键。如下图所示:

一开始拉取的数据并未有guid的值,都是int类型转换过来的数据,所以sql脚本运行的正常,但是突然某一次运行时,出现了“在将 nvarchar 值 ‘4c185367-f004-41fe-8a0a-db4e819b1ff2’ 转换成数据类型 int 时失败。”的错误。如下图所示:

定位到脚本,执行的sql如下:

select * from dbo.demo where 混合id=305

其中主键中的数据有guid转换的字符型,也有int转换的字符串,示例数据如下:

但是如果执行下面的sql,则都是正常执行:

select * from dbo.demo where 混合id=305 and 名称='int'

select * from dbo.demo where 混合id=305 and 序号='2'

select * from dbo.demo where 混合id=305 and 序号=2

select * from dbo.demo where 混合id='305' and 名称='int'

select * from dbo.demo where 混合id='305'

结果如下:

出现上述错误的结果应该是这样的:

select * from dbo.demo where 混合id=305在执行时,sql server会将nvarchar类型的隐性转换成int类型,如果数据中没有guid类型的字符,则转换正常,如果有,当进行guid字符到int的隐性转换时,则转换失败。

以上就是本文的全部内容,希望对大家进行sql server数据类型转换有所帮助。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐