可能错误 - SQL Server 中的错误

Posted

技术标签:

【中文标题】可能错误 - SQL Server 中的错误【英文标题】:Possibly Error - Bug in SQL Server 【发布时间】:2013-11-20 15:04:27 【问题描述】:

当我执行查询时

select  * from Brands  where int1 = 1 and iswebactive=0 and ESHOP_CODE=1

在 Sql Server 中,服务器返回 2 行。 当我执行查询时

select  * from Brands  where isnull(int1,0) = 1 and iswebactive=0 and ESHOP_CODE=1

Sql 服务器返回多于 2 行。问题是 int1=1 有 650000 条记录,但第一个查询只返回 2 行。 字段类型有:

int1 : int
iswebactive : tinyint
ESHOP_CODE : smallint

为什么会这样?


select  int1,* from Brands  where int1 = 1 and iswebactive=0 and ESHOP_CODE=1 

(返回 58 行。)

select  int1,* from Brands  where isnull(int1,0) = 1 and iswebactive=0 and ESHOP_CODE=1

(返回 16134 行)

SQL Server 的版本是 2008 R2 Express。

我的问题是当我使用isnull 函数(第二次查询)结果是正确的!

为什么第一个查询只返回 58 行?

【问题讨论】:

您是否有一个示例数据行,用于第二个查询但不是第一个查询?以及您使用的是什么版本的 SQL(包括服务包)? 这很奇怪。话虽如此,请不要在 where 子句中使用 isnull 。只能使用IS NULLIS NOT NULL,否则你是在问心痛。 您应该向我们提供一个 SQLFiddle 来向我们展示该错误 这里有一个对你很有帮助的提示:“这总是你的错”。它绝不是操作系统错误、数据库错误或框架错误。它总是你的错误。 我发现了发生了什么......我已经有了这 3 列的索引。我发现 int1 的索引值与 int1 的实际值不同。当然,当我重建索引时,一切都很好。所以我想这不是我的错。这是 MSSQL 的错。感谢@uncle brad 的宝贵时间和建议。 【参考方案1】:

在 SQL Server 中没有这样的 Bug,至少对于这些类型的更简单的选择查询。通过分解和执行检查您的选择查询。或者您的列值可能有问题,只需尝试

SELECT ISNULL(COL_NAME,0) FROM TABLE_NAME 

对所有列执行此操作并查看结果。

【讨论】:

如果索引损坏,可能会发生这种情况。从 cmets 看来,他们似乎表明情况确实如此。 where isnull(int1,0) = 1 版本将使表达式不可分割,这意味着使用了不同的索引。 是的。但我不这么认为,这是一种Bug。这是由于用户错误,可能会在 SQL Server 中禁用、删除约束。 损坏可能表示硬件有故障或配置不正确。或者可能运行第三方错误过滤器驱动程序或扩展存储过程,而不是实际的产品错误。

以上是关于可能错误 - SQL Server 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 错误代码都有哪些

如何解决 SQL Server 2000 中的连接问题

SQL Server 中的转义字符

更新或插入 SQL Server 时忽略错误行

SQL Server 中的错误更新

SQL Server 2008 中的错误日志记录