为什么SQL语句在SQL条件中用于列类型为varchar时失败,并且在将数字类型列添加为条件时运行时没有任何错误

nwG*_*ham 2 t-sql sql-server sql-server-2008

我有一个SQL服务器表列,其定义varchar为此列中存储的数据1,2,3.我运行了以下查询,但失败了(我很清楚原因):

select * from <table> where <column1> in (1,2,3)
Run Code Online (Sandbox Code Playgroud)

但是,我在同一个表中有另一列定义为numeric.如果我使用numeric列添加另一个条件到上面的查询,它的工作原理:

select * from <table> where <column1> in (1,2,3) and <column2> = 20
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下SQL Server的行为是什么原因吗?

此外,我有更大的查询,其中包含定义为第一个查询的条件在同一数据库服务器上的某些数据库上工作,而同一服务器上的其他数据库失败(抱歉,我不能在此处粘贴查询).

我跑上面查询SQL Server 2008 R2服务器.

以下是我收到的错误消息;

将varchar值'36O5A'转换为数据类型int时转换失败.

其中'36O5A'是varchar列中一系列"数字字符"值之后的第一个字母数字值.

a_h*_*ame 7

如果column1是varchar,则不应将其与数字进行比较.1是一个数字'1'是一个字符值.

通过传递数字,SQL Server会尝试将值转换column1为数字 - 这在第一个示例中失败,因为该列包含无法(隐式)转换为数字的值.

第二个查询过滤掉那些无效的数字,因此它可以工作.

在第一个查询中使用正确的字符值,它会没问题:

select * 
from the_table 
where column1 in ('1','2','3');
Run Code Online (Sandbox Code Playgroud)

如果第一个查询在某些环境中工作而在其他环境中不起作用,那么显然它的工作只包含可以转换为数字的值.

即使where条件仅"选择"有效数字,数据库仍然必须比较表中的所有值以查找与条件匹配的值.

即使列上有索引,您也不能依赖数据库来处理"有效"值.


永远不要依赖隐式数据类型转换.

你刚刚学到了很难的方法.