可能错误 - 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 NULL
或IS 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 中的错误的主要内容,如果未能解决你的问题,请参考以下文章