2012-04-18 71 views
4

我遇到了一个有趣的存储过程,我需要你的帮助来解决这个问题。SQL Server 2005 - 比较字符列与int

基本上,存储过程SELECT s的WHERE条件,其中的条件是:

WHERE SomeType = 2 

SomeTypechar(3)柱,其中包含像'1','2','AA','AB'值等

当我运行在存储过程中SSMS,它失败:

Msg 245,Level 16,State 1,Line 1
将varchar值“AA”转换为数据类型为int的列的语法错误。

但是,当我通过生产中的应用程序使用该存储过程时,它返回的数据没有任何问题。

我的问题是,这怎么可能?

+0

处理存储过程的错误处理将是最可能的解释。不要原谅它的错误代码(一个简单的'CAST',或者用引号将'2'修复就可以修复它) – hkf 2012-04-18 06:57:46

+0

是的,正好......'2'应该工作。在SomeType = – Milee 2012-04-18 07:02:52

+0

我知道这是一个不好的编码,它会被'2'等修复,但它没有任何意义,SP在SSMS失败,但成功的应用程序使用此SP。 – James 2012-04-18 07:07:37

回答

2

你在评论中说,你有额外的WHERE条款未显示。

该问题可能是不同的执行计划。例如假设你的真实WHERE条件

WHERE SomeType = 2 AND Foo = 'X' 

,数据仍然是

SomeType Foo 
-------- ---- 
1  X 
2  X 
AA  Y 
AB  Y 

然后在一个实例可能评估美孚=“X”先离开行

SomeType Foo 
-------- ---- 
1  X 
2  X 

然后运行IMPLICIT_CAST(SomeType AS INT) = 2条件针对这些过滤行没有问题。

但是,如果顺序颠倒,使得它首先计算SomeType = 2条件,那么它将需要的值AAAB转换为int和查询将失败。

2

该应用程序可能使用不同的参数调用SP,以便从不执行错误代码。或者应用程序可能会忽略该错误。

+0

+1我同意,这些是唯一的选择 – 2012-04-18 09:18:46

+0

我会尝试使用探查器看到在prod上运行的语句,但我需要找到有权访问的人! – James 2012-04-19 01:55:51

0

int转换成Char我认为它会正常工作。