VS2010 与 SQL2005 聚合函数用法
工作中无意间会遇到问题,今天遇到一个数据整合的问题,正好今天不算太忙,就小试了一下 VS2010 SQL 中的聚合函数,直接说需求吧
原本的数据是
ID Name
1 张三
1 李四
2 王五
3 试试
3 得到
3 大
最后 结果数据
ID Name
1 张三;李四;
2 王五;
3 试试;得到;大;
首先在 vs2010 中创建一个 的数据库 SQL CLR 数据库项目
弹出一个选择数据连接的对话框直接点击添加引用
选择自己的数据库后会在右边解决方案中生成一些相关的JS和文件
右击项目选择添加一个聚合函数
添加好聚合函数类之后
修改代码
把原有的
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
替换成 (具体的目前我也在看)
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined, //use custom serialization to serialize the intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000) //maximum size in bytes of persisted value
]
[SqlUserDefinedAggregate(
Format.UserDefined, //use custom serialization to serialize the intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000) //maximum size in bytes of persisted value
]
生成的类没有继承 : IBinarySerialize
剩下的代码如下
private System.Text.StringBuilder intermediateResult;
public void Init()
{
intermediateResult = new System.Text.StringBuilder();
}
public void Accumulate(SqlString Value)
{
intermediateResult.Append(Value.Value + ";"); // 此处可以自己随便修改
}
public void Merge(Aggregate1 Group)
{
intermediateResult.Append(Group.intermediateResult);
}
public SqlString Terminate()
{
return new SqlString(intermediateResult.ToString());
}
public void Init()
{
intermediateResult = new System.Text.StringBuilder();
}
public void Accumulate(SqlString Value)
{
intermediateResult.Append(Value.Value + ";"); // 此处可以自己随便修改
}
public void Merge(Aggregate1 Group)
{
intermediateResult.Append(Group.intermediateResult);
}
public SqlString Terminate()
{
return new SqlString(intermediateResult.ToString());
}
#region IBinarySerialize 成员
public void Read(System.IO.BinaryReader r)
{
intermediateResult = new StringBuilder(r.ReadString());
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.intermediateResult.ToString());
}
#endregion
public void Read(System.IO.BinaryReader r)
{
intermediateResult = new StringBuilder(r.ReadString());
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.intermediateResult.ToString());
}
#endregion
这样我的聚合函数就写好了,剩下的就是部署了,vs中提供了部署,头一次部署老会出现问题,经过几次总结出
右击项目选择属性 选择应用程序,目标框架一定要修改为3.5的
最后在部署一下 这样聚合函数就完成
接下来就可以直接在SQL中写入
select id,数据库名称.dbo.StringJoin(name) from 表名 group by id
经过测试可以
都一次写这样的博客,如有错误见谅.....