SQL 2005中的联接问题 50zhaohy023]

发布时间:2016-12-6 10:53:32 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"SQL 2005中的联接问题 50zhaohy023]",主要涉及到SQL 2005中的联接问题 50zhaohy023]方面的内容,对于SQL 2005中的联接问题 50zhaohy023]感兴趣的同学可以参考一下。

在SQL 2005中执行下列语句的时候出错: 在将 varchar 值 '1.1' 转换成数据类型 tinyint 时失败。 select  a.*,b.CONSTANT_DISP_TEXT from FDCF_CONTNR a  left outer join BSE_CONSTANT_DICT b on a.CONTNR_OB_STATUS_SID = b.CONSTANT_VALUE  and b.CONSTANT_CATEGORY_CID = 'FDCF_CONTNR_OB_STATUS_SID'  where (a.SPMT_BASIC_ID='RID063V0MR3EV2T3') 其中a.CONTNR_OB_STATUS_SID是tinyint类型,b.CONSTANT_VALUE是varchar类型. 如果说是不满足隐式转换,但是把where子句注释掉,就可以顺利执行,搞不明白为什么? 还有如果在SQL 2000中执行的话,注不注释掉where子句都能顺利执行。

我也试过用显示转换convert(varchar,a.CONTNR_OB_STATUS_SID) = b.CONSTANT_VALUE 也执行成功。把语句写成 select a.*,b.CONSTANT_DISP_TEXT  from FDCF_CONTNR a ,BSE_CONSTANT_DICT b where a.CONTNR_OB_STATUS_SID = b.CONSTANT_VALUE  and b.CONSTANT_CATEGORY_CID = 'FDCF_CONTNR_OB_STATUS_SID'  and a.SPMT_BASIC_ID='RID063V0MR3EV2T3' 可以的,为什么上面那种就会出错呢?

没用过2005 估计可能跟语句执行顺序有关 可以参考连机帮助相关介绍

1. 隐式转换的规则是字符会转换成数字做比较    所以当然可能会有转换错误, 把条件去了, 根本不存在转换的问题, 当然不报错了. 2. sql的执行依赖于执行计划, 包括条件的顺序.    所以你根本无法保证 a.CONTNR_OB_STATUS_SID = b.CONSTANT_VALUE  是最后执行的, 那只要任何记录不满足转换要求, 都可能报错啦. 3. 不要埋怨sql 2005, 2000 一样的此问题. 其他大型数据库也有此问题.    如果没有此问题, 那只能说明系统的自动优化算法写得不好, 或者根本没有优化.

select  a.*,b.CONSTANT_DISP_TEXT from FDCF_CONTNR a  left outer join BSE_CONSTANT_DICT b on a.CONTNR_OB_STATUS_SID = b.CONSTANT_VALUE  and b.CONSTANT_CATEGORY_CID = 'FDCF_CONTNR_OB_STATUS_SID'  写成这样存在转换问题吗?在2005中也可以执行。

钻石zjcxc(邹建)说的不错,顶

都钻石了,当然不错。 刚才我又在SQL 2005中又执行了一次这个语句: select  a.*,b.CONSTANT_DISP_TEXT from FDCF_CONTNR a  left outer join BSE_CONSTANT_DICT b on a.CONTNR_OB_STATUS_SID = b.CONSTANT_VALUE  and b.CONSTANT_CATEGORY_CID = 'FDCF_CONTNR_OB_STATUS_SID'  where (a.SPMT_BASIC_ID='RID063V0MR3EV2T3') 今天居然成功了,没有错误了。搞不懂了!

是执行计划变了吧,可它是自己变的还是有什么设置呢?

条件不同, 数据不同, 都可能导致执行计划不同. 所以楼主可以不用测试了.

上一篇:数据库复制中“域”的概念 20hhyyjj0000]
下一篇:日期型转换问题 20ouyangfen]

相关文章

相关评论