是否可以将用户定义的聚合(clr)与窗口函数(over)一起使用?
在文档中找不到答案:http://technet.microsoft.com/en-us/library/ms190678.aspx http://technet.microsoft.com/en-us/library/ms190678.aspx
你是对的,在文档中找到任何东西都很棘手。但是搜索 Connect 网站,我设法找到了这个gem https://connect.microsoft.com/SQLServer/feedback/details/586867/user-defined-ranking-functions:
现在,您可以像常规聚合函数一样使用带有 OVER 子句和 PARTITION BY 的 CLR 聚合。一旦我们支持窗口函数......
这是微软的回应。
然而,当我等待我的旧机器创建一个新的数据库项目并创建此聚合时,我在 Connect 站点上进行了搜索:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,MaxByteSize = 2000)]
public struct SqlAggregate1 : IBinarySerialize
{
private SqlString last;
public void Init()
{
// Ignore
}
public void Accumulate(SqlString Value)
{
last = Value;
}
public void Merge (SqlAggregate1 Group)
{
// Ignore
}
public SqlString Terminate ()
{
// Put your code here
return last;
}
public void Read(BinaryReader r)
{
last = new SqlString(r.ReadString());
}
public void Write(BinaryWriter w)
{
w.Write(last.ToString());
}
}
然后运行这个脚本:
select dbo.SqlAggregate1(Column2) OVER (PARTITION BY Column1)
from (select 1,'abc' union all select 1,'def' union all
select 2,'ghi' union all select 2,'jkl') as t(Column1,Column2)
其产生:
------------
abc
abc
ghi
ghi
说来话长——你自己就可以轻松找到答案trying it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)