[本人的CSDN博文不介意被转载,但请注明出处]
SQL内置了很多函数,但总不可能面面俱到。这里我们以Base64算法编码字符串为例,解释如何用C#编写的类库DLL扩充SQL功能。
建立一个普通的类库项目,编写代码没有任何不同,但要注意:
1 记得 using Microsoft.SqlServer.Server;
2 函数必须是public的静态方法;
3 想发布给SQLSERVER的函数前加一句[SqlFunction(DataAccess=DataAccessKind.None)]
4 一定要记下[命名空间].[命名空间.类名].[函数名]。
5 注意SQL类型与C#类型的对应关系。C#的string对应的是nvarchar/nchar。
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Microsoft.SqlServer.Server;
- namespace KI.SQL
- {
- public class KiBase64
- {
- public KiBase64()
- {
- }
- [SqlFunction(DataAccess = DataAccessKind.None)]
- /// <summary>
- /// Base64编码
- /// </summary>
- /// <param name="encode"></param>
- /// <returns></returns>
- public static string Encode(string encode)
- {
- string rtn = "";
- try
- {
- byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(encode);
- rtn = Convert.ToBase64String(bytes);
- }
- catch
- {
- rtn = "";
- }
- return rtn;
- }
- [SqlFunction(DataAccess = DataAccessKind.None)]
- /// <summary>
- /// Base64解码
- /// </summary>
- /// <param name="code"></param>
- /// <returns></returns>
- public static string Decode(string code)
- {
- string decode = "";
- try
- {
- byte[] bytes = Convert.FromBase64String(code);
- decode = Encoding.GetEncoding("gb2312").GetString(bytes);
- }
- catch
- {
- decode = "";
- }
- return decode;
- }
- }
- }
调试通过后把DLL复制到服务器的某个目录下,比如x:/Ki1381下。
现在打开SQL2005的管理工作台,在指定的数据库中注册这个程序集:
create assembly [KI.SQL] -- 我项目的命名空间是KI.SQL
FROM 'x:/Ki1381/ki.sql.dll'
然后编写SQL函数:
CREATE FUNCTION EncodeBase64(@str nvarchar(100))
RETURNS nvarchar(800)
AS
External name [KI.SQL].[KI.SQL.KiBase64].Encode
同样可以把解码函数也做出来。
创建函数也许会报错,可以尝试启用一下clr enabled选项:
EXEC sp_configure 'clr enabled',1
go
RECONFIGURE
go
这样,SQL里就可以直接调用了。比如:select dbo.EncodeBase64('汉字&Abc') as Base64Chars