代码改变世界

SqlServer 0和空字符串''等价?-----类型的隐式转换问题

2011-08-24 21:22  QA龙  阅读(1491)  评论(0编辑  收藏  举报

今天在修改一个bug的时候发现的一个比较奇怪的问题查询部门的时候偶尔会出现错误多查出一个不正确的部门

最后找到了原因

部门表 deptInfo

部门ID         部门名称

deptId         deptName      fatherID

-----------------------------------------------

100              总裁办             0
101              企业管理中心     100

 

select * from deptInfo di where di.fatherId =返回部门Id的函数

我使用到的一个函数偶尔会返回一个空字符串''

select * from deptInfo di where di.fatherId = ''

查询结果

-----------------------------------------------

100              总裁办             0
让我一时很奇怪 怎么会出现这种结果,从网上直接搜索关键字 “SqlServer 0 和空字符串”也没有搜到原因

最后胡乱搜索看到了隐式转换这个词才想到这里

 

从网上找了些资料总结一下

隐式转换指那些没有指定 CAST 或 CONVERT 函数的转换。显式转换指那些需要指定 CAST 或 CONVERT 函数的转换。以下图例显示了可对 SQL Server 2005 系

统提供的数据类型执行的所有显式和隐式数据类型转换。其中包括 xmlbigintsql_variant。不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换。

从这张图上可以看到int型和varchar型之间是存在隐式转换的

隐式转换就像埋在我们身边的定时炸弹一样随时都可能爆发,我们写程序的的时候一定要小心