度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 896|回复: 6
打印 上一主题 下一主题

[分享] SQL Server数据类型转换方法

[复制链接]

348

主题

3572

帖子

9257

积分

论坛元老

Rank: 8Rank: 8

积分
9257
跳转到指定楼层
楼主
发表于 2020-3-26 23:58:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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转换的字符串,示例数据如下:


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

348

主题

3572

帖子

9257

积分

论坛元老

Rank: 8Rank: 8

积分
9257
沙发
 楼主| 发表于 2020-3-27 00:00:30 | 只看该作者
但是如果执行下面的SQL,则都是正常执行:
  1. select * from dbo.Demo where 混合ID=305 and 名称='INT'

  2. select * from dbo.Demo where 混合ID=305 and 序号='2'

  3. select * from dbo.Demo where 混合ID=305 and 序号=2

  4. select * from dbo.Demo where 混合ID='305' and 名称='INT'

  5. select * from dbo.Demo where 混合ID='305'
复制代码
结果如下:
出现上述错误的结果应该是这样的:
select * from dbo.Demo where 混合ID=305在执行时,SQL Server会将nvarchar类型的隐性转换成int类型,如果数据中没有GUID类型的字符,则转换正常,如果有,当进行GUID字符到INT的隐性转换时,则转换失败。

若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-3-27 15:00:54 | 只看该作者
阁下最近对 SQL Server 很有研究嘛!
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9257

积分

论坛元老

Rank: 8Rank: 8

积分
9257
地板
 楼主| 发表于 2020-3-27 17:33:42 | 只看该作者
陈晓龙 发表于 2016-4-27 15:00
阁下最近对 SQL Server 很有研究嘛!

学过,没用过,都忘忘完了,这边不是用的SqlServer数据库嘛,顺便捡捡

点评

你以前数据库就是学的sqlserver 所!  详情 回复 发表于 2020-3-28 15:25
你以前数据库就是学的sqlserver 所!  详情 回复 发表于 2020-3-28 15:24
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9257

积分

论坛元老

Rank: 8Rank: 8

积分
9257
5#
 楼主| 发表于 2020-3-27 17:35:12 | 只看该作者
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
6#
发表于 2020-3-28 15:24:59 | 只看该作者
万望 发表于 2016-4-27 17:33
学过,没用过,都忘忘完了,这边不是用的SqlServer数据库嘛,顺便捡捡

你以前数据库就是学的sqlserver 所!
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
7#
发表于 2020-3-28 15:25:02 | 只看该作者
万望 发表于 2016-4-27 17:33
学过,没用过,都忘忘完了,这边不是用的SqlServer数据库嘛,顺便捡捡

你以前数据库就是学的sqlserver 所!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-9-30 08:55 , Processed in 0.138236 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表