FIX: 多调用到用户定义的函数内的聚合函数可能会返回不正确的结果

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 288957
本文已归档。它按“原样”提供,并且不再更新。
错误 #: 236595 (SHILOH_BUGS)
症状
如果满足下列条件都为真,SQL Server 可能会返回不正确的结果的查询:
  • 该查询包含两个或多个相同的聚合函数的引用。
  • 这些聚合函数作为其参数需要一个调用以相同的用户定义函数 (UDF) 的结果。
  • 在调用该 UDF 通过相同的第一个参数。
  • UDF 采用两个或多个参数和返回依赖于这些辅助的参数的值的结果。
原因
优化器将尝试在查询中查找重复的聚合函数,以便每个唯一的聚合仅计算一次。该代码无法正常工作,需要考虑次要参数将被传送到 UDF,并且可能不正确地标识两个聚合为等效的。
解决方案
若要解决此问题,获得最新的 service pack,对于 Microsoft SQL Server 2000。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
290211INF: 如何获取最新的 SQL Server 2000 Service Pack

修补程序

: Microsoft SQL Server 2000 Service Pack 1 之前创建的以下修补程序。

此修复程序的英文版应具有以下文件属性或更高版本:
   Version      File name       Platform   -------------------------------------   8.00.251     s80251i.exe     x86				
状态
Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。Microsoft SQL Server 2000 Service Pack 1 中,第一次已得到纠正此问题。
更多信息
下面的示例演示此问题。

CREATE TABLE functest (c1 int NULL, c2 int NULL, c3 int NULL, c4 int NULL, c5 int NULL, c6 int NULL)GOINSERT INTO functest VALUES(1,2,3,4,5,6)goCREATE FUNCTION t3 (@one int, @two int, @three int) RETURNS int ASBEGIN  RETURN (@one*@two*@three)ENDGO--This works correctly, returns 720SELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c4,c5,c6)) correct FROM functestgo--This is incorrect, returns 36, should be 180SELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c1,c5,c6)) incorrect FROM functestgo--If you swap c1 and c6, the results are correct! (180)SELECT avg(dbo.t3(c1,c2,c3)) * avg(dbo.t3(c6,c5,c1)) correct FROM functest				
请注意如何获得不正确的结果,仅当 UDF 对这两个引用传递该相同的第一个参数作为列的名称或给函数的原义值。

警告:本文已自动翻译

属性

文章 ID:288957 - 上次审阅时间:01/16/2015 21:37:59 - 修订版本: 3.1

Microsoft SQL Server 2000 标准版

  • kbnosurvey kbarchive kbmt kbbug kbfix kbqfe kbsqlserv2000sp1fix KB288957 KbMtzh
反馈