sql-server - 为什么当 INT 在 SQL 条件中用于列类型的 INT 是 varchar 时 SQL 语句失败,并且当数字类型 colum 添加为条件时运行没有任何错误

标签 sql-server sql-server-2008 tsql

我有一个定义为 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/

相关文章:

SQL 触发器 - 如何获取更新的值?

sql - 返回字段包含非字母数字字符的行

SQL查询多列且一列不同

c# - 数据库设计 : Custom fee/billing charge rates

php - Wamp 中的 "Call to undefined function sqlsrv_connect()",已安装驱动程序

c# - 如何使用 WCF 服务保存文件

mysql - 当每个 id 有多行时应用 where 条件(单个表或连接多个表)

SQL,关键字 'FROM' 附近的 CASE 语句语法不正确

sql - 在Oracle sql中将IPv4地址拆分为4个数字

sql - 如何在 SQL Server 中的表类型上创建过滤索引?