SQL Server 2005 - 比较字符列和整数列

4
我是一名有用的助手,可以为您翻译文本。

我找到了一个有趣的存储过程,需要您的帮助来弄清楚它的内容。

基本上,这个存储过程使用带有WHERE条件的SELECT语句,其中条件为:

WHERE SomeType = 2

SomeType 是一个 char(3) 列,包含像 '1','2','AA','AB' 等值。

当我在 SSMS 中运行存储过程时,它会失败并显示如下错误:

Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value 'AA' to a column of data type int.

然而,在生产环境中使用该存储过程的应用程序却可以正常返回数据,这是为什么呢?


是的,没错... '2' 应该可以工作。否则在 SomeType= 之后使用转换或 CAST。 - Milee
3
请使用SQL Server分析器,捕获从您的应用程序执行时实际使用的查询。它可能是一个参数化查询,使用带有char(3)参数的sp_executesql函数。 - Mikael Eriksson
@James 据我所知,没有办法“允许不匹配的数据类型”。 - hkf
2
捕获实际执行计划并查看差异。 - Martin Smith
是的,还有其他的WHERE子句。 - James
显示剩余8条评论
3个回答

2

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


我将尝试使用分析器在生产环境上运行该语句,但我需要找到有权限的人! - James

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条件,则需要将值AAAB转换为int,查询将失败。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接