由于时间的缘故,创建存储过程、自定义函数、聚集、触发器等内容转自别人的文章。

文章来源:http://www.cnblogs.com/doc/archive/2009/02/11/1388513.html


 

SQLCLR(一)存储过程

    存储过程方法上方标注[Microsoft.SqlServer.Server.SqlProcedure]
    存储过程:
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)using System;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlClient;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlTypes;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using Microsoft.SqlServer.Server;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
public partial class StoredProcedures
  执行存储过程
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)DECLARE @name nvarchar(4000)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
DECLARE @outstr nvarchar(4000)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
set @name='david fan'
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
-- TODO: 在此处设置参数值。
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
EXECUTE [TestProject].[dbo].[TestStoredProcedure] 
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)   
@name
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
  ,@outstr OUTPUT
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
print @outstr

结果如下:
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

输出参数返回值:

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
 

 

 

SQLCLR(二)自定义函数

    自定义函数方法上方标注[Microsoft.SqlServer.Server.SqlFunction]。自定义函数又分TVF函数和Scalar两种,最大区别在于TVF返回表,后者返回Scalar(标量)

一)TVF函数

 

示例函数的作用是搜索目录下的某一类型的文件

 

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)using System;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.Sql;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlTypes;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using Microsoft.SqlServer.Server;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Collections;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.IO;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Security.Principal;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
public partial class UserDefinedFunctions
}
    因为这个函数对于sqlserver来讲要访问外部资源,所以需要配置一下项目和sqlserver2005。项目右键属性数据库,权限级别外部。
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

    打开sqlserver2005查询分析器执行下边语句 TestProject 为我的数据库名,你的如果不是,当然需要修改了。

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)ALTER DATABASE TestProject SET TRUSTWORTHY ON;
    成功后,项目右键部署

    查询分析器中执行
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)SELECT * FROM [TestProject].[dbo].[FileListCs] (
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)   
'c:\'
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)  ,
'*.txt')

 

    结果如下:

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

 

二) Scalar 函数
   这类函数返回类型如图,像SqlString这类sqlserver的scalar类型
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

    下面就是这类函数的一个小例子。

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)using System;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlClient;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlTypes;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using Microsoft.SqlServer.Server;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
public partial class UserDefinedFunctions
;

 

    sqlserver查询查询分析器中运行如下语句

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)SELECT [TestProject].[dbo].[ScalarFunction] ()

 

    结果如下:

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

SQLCLR(三)触发器

     这一节比较简单了,主要是讲如何在SQLCLR下设计触发器。在SQLServer2005里分两种触发 器,DDL和DML两种触发器。DDL触发器是响应CREATE、ALTER 和 DROP 开头的语句。我们常用的是DML触发器,这一类触发器响应当数据库中发生数据操作包括表或视图中修改数据的 INSERT 、UPDATE 或 DELETE 。
对于.net来讲触发器也是方法,在上方标注[Microsoft.SqlServer.Server.SqlTrigger]标签(只我这样翻译)。
我们看一个小例子
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)using System;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.Sql;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using Microsoft.SqlServer.Server;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlClient;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
public partial class Triggers

右键部署。

数据库里的两张表
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

我执行两条UPDATE语句
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)update [NameInfo] set [name]='David' where id=1
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
update [nameinfo] set [name]='Fan' where id=2

 

结果:

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

再执行两条
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)update [NameInfo] set [name]='*David*' where id=1
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
update [nameinfo] set [name]='*Fan*' where id=2

 

再看结果:

 
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

 

SQLCLR(四)用户定义类型UDT

    用户自定义类型是SQL Server 2005的新特性。和前几篇文章介绍的SQLCLR相比,UDT相对有此复杂。UDT也有许多限制和必须遵守UDT规范。UDT的二进制不能超过8000 个字节,必须包含一个null值表示,因为SQLServer的数据类型是允许null值的。
UDT可以是结构或类。如果是类的话需加[StructLayout(LayoutKind.Sequential)]
标签(属性),这是保证序列化时不改变属性的次序。
现在看一段代码

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)using System;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.IO;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlClient;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlTypes;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using Microsoft.SqlServer.Server;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
[Serializable]
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = 1024)]
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
public struct Person : INullable, IBinarySerialize

部署后在SQL Server 2005中执行下面的语句
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)create table UdtTest (Id int not null, p Person not null)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
insert into UdtTest values(1'David,24岁,男')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
select id, convert(nvarchar(25),p) from UdtTest
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
drop table UdtTest
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

结果如下:

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

想看清楚SQLCLR在对UDT处理机制可以将项目附加到SQL Server 2005进程,在相应的方法设置断点。
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
 

 

 

SQLCLR(五)聚合

     SQL Server中的聚合,常用的比如max,count之类。 我们现在也可以在SQLCLR里创建自定义的聚合。Visual Studio 2005中提供的聚合模板是一个结构,标注了[Serializable],[SqlUserDefinedAggregate]标签,这将让 SQLCLR知道这是一个聚合函数。
看一段代码,这段代码来自SQL Server 2005联机丛书,本来自己想写一段,但突然公司有些事要做,没时间了。示例代码作用是合并同一部书(ID相同)的作者。
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)using System;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using Microsoft.SqlServer.Server;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Data.SqlTypes;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.IO;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
using System.Text;
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
[Serializable]
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
[SqlUserDefinedAggregate(
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
    Format.UserDefined, //use clr serialization to serialize the intermediate result
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
    IsInvariantToNulls = true//optimizer property
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
    IsInvariantToDuplicates = false//optimizer property
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
    IsInvariantToOrder = false//optimizer property
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
    MaxByteSize = 8000//maximum size in bytes of persisted value
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
]
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
public class Concatenate : IBinarySerialize
}

 

    这里有几个比较重要的方法:Terminate,这个方法是聚合最后调用的方法,它返回最后的值。可以是SQL Server的任何标量。;Accumulate,聚合每处理一行数据的时候都会调用一次,并将要处理的数据传给方法。可以在函数内部进行比如比较,合并 之类的处理。;

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)CREATE TABLE BookAuthors
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
(
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
   BookID   int       NOT NULL,
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
   AuthorName    nvarchar(200NOT NULL
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
INSERT BookAuthors VALUES(1'Johnson')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
INSERT BookAuthors VALUES(2'Taylor')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
INSERT BookAuthors VALUES(3'Steven')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
INSERT BookAuthors VALUES(2'Mayler')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
INSERT BookAuthors VALUES(3'Roberts')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
INSERT BookAuthors VALUES(3'Michaels')
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)SELECT BookID, dbo.MyAgg(AuthorName)
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
FROM BookAuthors
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
GROUP BY BookID
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)
结果如下
BookID Author Names

1

Johnson

2

Taylor, Mayler

3

Roberts, Michaels, Steven


Microsoft SQL Server Management Studio为我们提供了数据库内对象的集中管理功能,前面几篇创建的SQLCLR对象,都可以在数据库的可编程性下相应模块里找到。
SQLCLR在Visual Studio中创建存储过程、自定义函数、聚集、触发器等方法(转)

 

 

 

相关文章: