2009-12-28 5 views
1

У меня есть этот SQL Server определенного пользователя агрегат:SQL Server определяемого пользователь агрегатным возвращает ошибку, если агрегирование 0 строк

[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:) 

ответ

1

Изменить свойство IsNullIfEmpty в SqlUserDefinedAggregateAttribute к false и он будет работать.

Это, безусловно, ошибка в SQL Server, надеюсь, кто-то важный заметит его и откроет для него проблему Connect.

+0

Btw, я надеюсь, что этот способ загрузки этой информации - правильное использование SO. – erikkallen

+0

Ты спас мой день :) – Palantir

0

Я не знаю об объекте IsNullIfEmpty, но то, что помогло мне с этой ошибкой, использует запрос «OPTION (MAXDOP 1)» с запросом. По-видимому, существует некоторая проблема параллелизма с агрегатными функциями CLR в SQL Server 2005, а «MAXDOP 1» ограничивает степень параллелизма.