4

我遇到了一个有趣的存储过程,我需要你的帮助来解决这个问题。

基本上,存储过程SELECTsWHERE的条件是:

WHERE SomeType = 2

SomeType是一char(3)列,其中包含诸如'1','2','AA','AB'etc之类的值。

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

消息 245,级别 16,状态 1,第 1
行将 varchar 值“AA”转换为数据类型 int 的列的语法错误。

但是,当我通过生产中的应用程序使用该存储过程时,它会毫无问题地返回数据。

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

4

3 回答 3

2

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

于 2012-04-18T08:03:01.663 回答
2

您在评论中说您有WHERE未显示的附加条款。

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

WHERE SomeType = 2 AND Foo = 'X'

你的数据是

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

然后在一个实例上,它可能会评估 Foo = 'X' 首先离开行

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

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

但是,如果顺序颠倒,使其首先评估SomeType = 2条件,则需要将值强制转换为,AA并且查询将失败。ABint

于 2012-04-19T05:49:25.457 回答
0

转换intChar,我认为它会正常工作。

于 2012-04-18T14:18:47.360 回答