用.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

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