【问题标题】:SQL Server user-defined aggregate returns an error if aggregating 0 rows如果聚合 0 行,SQL Server 用户定义的聚合将返回错误
【发布时间】:2010-12-30 11:04:23
【问题描述】:

我有这个 SQL Server 用户定义的聚合:

[SqlUserDefinedAggregate(Format.UserDefined, Name="median", IsInvariantToDuplicates=false, IsInvariantToNulls=true, IsInvariantToOrder=true, IsNullIfEmpty=true, MaxByteSize=8000)]
public class MedianCalculator : IBinarySerialize {
    private List<double> values;

    public void Init() {
        values = new List<double>();
    }

    public void Accumulate(SqlDouble value) {
        if (!value.IsNull)
            values.Add(value.Value);
    }

    public void Merge(MedianCalculator other) {
        values.AddRange(other.values);
    }

    public SqlDouble Terminate() {
        if (values == null || values.Count == 0)
            return SqlDouble.Null;
        values.Sort();
        return (values[(int)Math.Floor((values.Count - 1) / 2.0)] + values[(int)Math.Ceiling((values.Count - 1) / 2.0)]) / 2.0;
    }

    public void Read(BinaryReader r) {
        int c = r.ReadInt32();
        values = new List<double>(c);
        for (int i = 0; i < c; i++)
            values.Add(r.ReadDouble());
    }

    public void Write(BinaryWriter w) {
        w.Write(values.Count);
        for (int i = 0; i < values.Count; i++)
             w.Write(values[i]);
    }
}

部署此聚合后,我尝试运行此查询:

select dbo.median(x) from (select 1 as x where 1 = 0) t

我得到这个错误:

A severe error occurred on the current command.  The results, if any, should be discarded.

但是,这是可行的:

create table #t(x int)
select dbo.median(x) from #t
drop table #t

并按预期返回 NULL。

这似乎是 SQL Server 中的一个错误,但我该如何解决呢?

select @@version
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition on Windows NT 6.1 (Build 7100: ) 

【问题讨论】:

    标签: sql-server user-defined-aggregate


    【解决方案1】:

    将 SqlUserDefinedAggregateAttribute 的 IsNullIfEmpty 属性更改为 false 即可。

    这绝对是 SQL Server 中的一个错误,希望重要的人会注意到它并为此打开一个 Connect 问题。

    【讨论】:

    • 顺便说一句,我希望这种上传此信息的 Q/A 方式是 SO 的正确用法。
    【解决方案2】:

    我不知道 IsNullIfEmpty 属性,但帮助我解决此错误的是在查询中使用“OPTION(MAXDOP 1)”。显然,SQL Server 2005 中的 CLR 聚合函数存在某种并发问题,并且“MAXDOP 1”限制了并行度。

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 2019-07-20
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多