我有一个定义为 varchar
的 SQL 服务器表列,存储在该列中的数据是 1,2,3
。我运行了以下查询但失败了(我很清楚原因):
select * from <table> where <column1> in (1,2,3)
但是,我在同一个表中还有另一列定义为 numeric
。如果我在上面的查询中使用 numeric
列添加另一个条件,它将起作用:
select * from <table> where <column1> in (1,2,3) and <column2> = 20
有人可以解释一下 SQL Server 出现这种行为的原因吗?
此外,我有更大的查询,其中包含定义为第一个查询在同一数据库服务器上的某些数据库上工作而同一服务器上的其他数据库失败的条件(抱歉,我无法在此处粘贴查询)。
我在 SQL Server 2008 R2 服务器上运行了上面的查询。
以下是我得到的错误信息;
将 varchar 值 '36O5A' 转换为数据类型 int 时转换失败。
其中“36O5A”是 varchar 列中一系列“数字字符”值之后的第一个字母数字值。
最佳答案
如果 column1
是一个 varchar,您应该不将它与数字进行比较。 1
是一个数字 '1'
是一个字符值。
通过传递数字,SQL Server 尝试将 column1
中的值转换为数字 - 这在您的第一个示例中失败,因为该列包含无法(隐式)转换为数字的值。
第二个查询过滤掉了那些无效的数字,因此它起作用了。
在第一个查询中使用正确的字符值就可以了:
select *
from the_table
where column1 in ('1','2','3');
如果第一个查询在某些环境中有效而在其他环境中无效,那么显然它有效的那些只包含可以转换为数字的值。
即使where
条件只是“选择”了有效数字,数据库仍然需要比较表中的所有 值以找到符合条件的值。
即使在列上有索引,您也不能依赖数据库只处理“有效”值。
永远、永远不要依赖隐式数据类型转换。
你刚刚通过艰难的方式学到了这一点。
关于sql-server - 为什么当 INT 在 SQL 条件中用于列类型的 INT 是 varchar 时 SQL 语句失败,并且当数字类型 colum 添加为条件时运行没有任何错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40547838/