用.net开发 sql server 2005 的自定义函数

以前我一直用SQL写自定义的函数,供自己在存储过程和SQL语句中使用,但是T-SQL语言写比较复杂逻辑的函数很麻烦,这是由T-SQL语言的特性所决定的.
最近才知道SQL-SERVER 2005 中提供了编写 CLR 的托管代码的支持, 也就是说可以很方便地用C#,VB.NE或C++写需要的函数逻辑,供SQL-SERVER 2005作为函数调用了, 我想这能大大提高T-SQL编写人员的工作效率和数据库操作的执行效率.
下面我以一个常用的聚合函数为例,用C#说明如何用.net开发数据库函数:

用 Visual Studio 2008 建立一个 C# 的 Database 项目,项目模版选择 SQL Server 。在项目管理器里添加一个 Aggregate 后,输入代码如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;


[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
public struct Aggregate1
{
    private StringBuilder _result;

    public void Init()
    {
        _result = new StringBuilder();
    }

    public void Accumulate(SqlString Value)
    {
        if (Value.IsNull)
        {
            return;
        }
        else
        {
            if (_result.Length > 0)
                _result.Append(",");
            _result.Append(Value.Value);
        }
    }

    public void Merge(StrJoin Group)
    {
        _result.Append(Group._result);
    }

    public SqlString Terminate()
    {
        if (_result.Length > 0)
        {
            return new SqlString(_result.ToString());
        }
        return new SqlString("");
    }
}
以下摘自网上:
其原理是该类中提供了几个模版方法:Init(), Accumulate(), Merge(), Terminate().
我们需要做的是在其中写自己的聚合逻辑即可。这几个方法的含义分别是初始化,扫描到一条记录时,合并,终止扫描。

需要注意以下几点:

1. 自定义聚集函数中,我们返回的数据会被序列化然后转换到 SQL Server 中,对一些数值类型 Framework 提供了默认的序列化机制,但其他一些 CLR 的类型比如 string 就必须自己实现序列化机制,也就是实现 IBinarySerialize 接口。

2. 返回值和 SQL Server 里定义的变量相同,受到 8000 字节的长度限制。

3. SQL Server 2005 必须配置兼容性级别为 "SQL Server 2005(90)", 否则会出现如下错误:
 EXTERNAL 附近有语法错误。您可能需要将当前数据库的兼容级别配置为更高的值,
以启用此功能。有关存储过程 sp_dbcmptlevel 的信息,请参见帮助。
4. 需要开启 SQL Server 2005 对 CLR 的支持(假如没有打开的话)。
执行如下命令:
EXEC sp_configure clr enabled, 1
RECONFIGURE WITH OVERRIDE
GO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章