ms sqlserver clr应用(一)

来源:互联网 发布:批处理调用软件 编辑:程序博客网 时间:2024/05/18 01:46
mssql 的存储过程和函数的功能已经很强大了,但要做一些涉及IO操作的处理时,还是需要clr的帮忙。本文主要阐述创建clr的过程及注意事项。 
一、CLR 程序的创建前对数据库的准备工作:
  • 允许数据库使用clr:
                                exec sp_configure 'show advanced options', '1';            go            reconfigure;            go            exec sp_configure 'clr enabled', '1'            go            reconfigure;                     
  • 数据库设为值得依赖。
                                ALTER DATABASE test SET TRUSTWORTHY ON;                        
 二、用C#编写clr
            using System;    using System.Data.SqlTypes;    namespace  gym    {        public class gymtest        {           //用于创建函数            public static string todate( string cstr)  //要用static            {                DateTime d;                if (!DateTime.TryParse(c, out d))                      d = DateTime.Now;                if (d < DateTime.Parse("1900-01-01"))                     d = DateTime.Now;                return d;                //C#中的日期范围是从1-1-1开始,而sql server中是从1753-1-1开始            }           //用于创建存储过程            public static SqlInt32 div(SqlInt32 i, ref SqlInt32 j, out SqlInt32 k)            {                if (i.IsNull || j.IsNull) { k = SqlInt32.Null; return 1; }                k = i.Value % j.Value;                j = i / j;                return 0;            }          //用于创建触发器          [SqlTrigger(Name = @"send_sms", Target = "[dbo].[sms]", Event = "FOR INSERT")]          unsafe public static void send_sms()           {           ...// 下一篇讲如何利用触发器通过短信猫发送短信            }        }    }                        
 三、编译成dll文件
            //注意.net版本,sql2008还是用.net 2.0编译     csc /t:library /out:c:\gym.dll   c:\gym.cs /unsafe        
 四、创建程序集
            create assembly gym from 'c:\gym.dll' with PERMISSION_SET=UNSAFE        //如果C#中涉及到unsafe代码的,要设PERMISSION_SET=UNSAFE        
 五、创建clr存储过程或触发器
  • 建立函数
                                  create FUNCTION [dbo].[ctod](@c nvarchar(10))  //ctod函数名              RETURNS datetime WITH EXECUTE AS CALLER              AS              EXTERNAL NAME [gym].[gymtest].[todate]  //依次:namespace.class.function                
  • 建立存储过程
                                create proc mydiv @i int,@j int output,@k int output  //参数及属性要一一对应            as             external name [gym].[gymtest].[div]  //依次:namespace.class.function                          
  • 建立触发器
                                CREATE TRIGGER smstrigger             ON sms FOR INSERT  //sms表名            AS            EXTERNAL NAME gym.gymtest.send_sms //依次:namespace.class.function                                                     

注:能用SQL存储过程解决的事情最好不用CLR,CLR的效率远远低于sql的存储过程,特别是查询表之类的操作

0 0
原创粉丝点击