我遇到了一个有趣的存储过程,我需要你的帮助来解决这个问题。
基本上,条件为SELECT
条件的存储过程WHERE
:
WHERE SomeType = 2
SomeType
是char(3)
列,其中包含'1','2','AA','AB'
等值。
当我在SSMS中运行存储过程时,它失败并显示:
Msg 245,Level 16,State 1,Line 1
语法错误将varchar值'AA'转换为数据类型为int的列。
但是,当我通过Production中的应用程序使用该存储过程时,它会毫无问题地返回数据。
我的问题是,这怎么可能?
答案 0 :(得分:2)
应用可能正在使用不同的参数调用SP,因此永远不会执行错误的代码。或者应用程序可能只是忽略错误。
答案 1 :(得分: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
和AB
转换为int
,查询将失败。
答案 2 :(得分:0)
将int
转换为Char
,我认为它会正常工作。