「存储过程」(
Stored Procedures
)
是
SQL Server 2005
程序设计中最重要的一环,您将会发现,应用系统中的许多作业都会交由存储过程来完成
。在以下的操作步骤中,我们将带领大家利用
Visual Studio 2005
整合式开发环境,实际建立一个
CLR
存储过程(采用
Visual C#
),并示范如何使用它:
1.
如图表
1
所示,选取
Microsoft Visual Studio 2005
菜单指令来开启
Visual Studio 2005
的整合式开发环境。

图表
1
2.
从「项目」菜单中选取「新增/项目」指令。
3.
如图表
2
所示,选取「类别库」模板,然后依序指定项目名称(
SayHello
)、存放位置、以及方案名称(
SayHello
)之后,按一下「确定」按钮。

图表
2
4.
于
Visual Studio 2005
整合式开发环境的「方案总管」中,使用鼠标右键按一下预设建立的
Class1.cs
并从快捷菜单中选取「删除」指令以便将它删除。
5.
从「项目」菜单中选取「加入新项目」指令。
6.
如图表
3
所示,于「加入新项目」对话框中,选取「类别」模板,然后以
SayHelloClass.cs
作为类别档的文件名称,然后按一下「加入」按钮。

图表
3
7.
于程序代码编辑器中,将
SayHelloClass
类别的程序代码改写如下:
using Microsoft.SqlServer.Server;
namespace SayHello
{
public class SayHelloClass
{
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void SayHello(ref string greeting)
{
SqlMetaData columnInfo = new SqlMetaData(" 问候 " , SqlDbType.NVarChar, 12);
SqlDataRecord greetingRecord = new SqlDataRecord(new SqlMetaData[] { columnInfo });
greetingRecord.SetString(0, " 大家好,我是章立民! " );
// 呼叫 Pipe 对象的 Send 方法将单一数据列结果集(也就是 SqlDataRecord 对象)
// 直接传送给客户端。
SqlContext .Pipe.Send(greetingRecord);
// 将文字符串指派给输出参数。
greeting = " 现在时间是 " + DateTime.Now.ToString() + " --- 章立民研究室向您问好! " ;
}
}
}
上述程序代码中的 SayHello 程序是一个公用静态方法,而它也就是 CLR 存储过程所实际呼叫的对象。
using Microsoft.SqlServer.Server;
namespace SayHello
{
public class SayHelloClass
{
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void SayHello(ref string greeting)
{
SqlMetaData columnInfo = new SqlMetaData(" 问候 " , SqlDbType.NVarChar, 12);
SqlDataRecord greetingRecord = new SqlDataRecord(new SqlMetaData[] { columnInfo });
greetingRecord.SetString(0, " 大家好,我是章立民! " );
// 呼叫 Pipe 对象的 Send 方法将单一数据列结果集(也就是 SqlDataRecord 对象)
// 直接传送给客户端。
SqlContext .Pipe.Send(greetingRecord);
// 将文字符串指派给输出参数。
greeting = " 现在时间是 " + DateTime.Now.ToString() + " --- 章立民研究室向您问好! " ;
}
}
}
上述程序代码中的 SayHello 程序是一个公用静态方法,而它也就是 CLR 存储过程所实际呼叫的对象。
8.
按一下工具列中的「储存」按钮。
9.
如图表
4
所示,使用鼠标连按两下「方案总管」中的
Properties
节点,一开始会显示出「应用程序」索引卷标页面,您可以去设定组件名称与跟命名空间。不过以本实作演练而言,请采用默认值,不要更改。

图表
4
10.
按一下左侧的「编译」索引卷标来切换至其页面,并且将「建置输出路径」设定成
bin/
(如图表
5
所示),然后按一下工具列中的「储存」按钮。

图表
5
11.
从「建置」菜单中选取「建置
SayHello
」
指令。
12.
好的,我们现在已经完成组件的建置作业,现在必须回到
SQL Server Management Studio
中,以便登录组件并建立指向该组件的存储过程。
13.
请您于
SQL Server Management Studio
中执行以下的程序代码,以便使用
CREATE ASSEMBLY
陈述式来登录组件
SayHello.dll
,然后使用
CREATE PROCEDURE
陈述式建立一个会参考所登录之组件
SayHello.dll
的存储过程:
USE 北风贸易 ;
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'SayHello')
DROP PROCEDURE SayHello;
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'SayHello')
DROP ASSEMBLY SayHello;
GO
-- 登录组件 SayHello.dll (请务必确认组件所在路径正确)
CREATE ASSEMBLY SayHello
FROM 'C:/SQL2005Demo/CH13/SayHello/SayHello/bin/SayHello.dll'
WITH permission_set = Safe; |
GO ﹂──>组件的位置路径
-- 建立一个会参考所登录之组件 SayHello.dll 的存储过程
CREATE PROCEDURE dbo.SayHello
(
@Greeting nvarchar(80) OUTPUT
)
AS EXTERNAL NAME SayHello.[SayHello.SayHelloClass].SayHello;
GO ↓
[ 命名空间 . 类别名称 ]
USE 北风贸易 ;
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'SayHello')
DROP PROCEDURE SayHello;
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'SayHello')
DROP ASSEMBLY SayHello;
GO
-- 登录组件 SayHello.dll (请务必确认组件所在路径正确)
CREATE ASSEMBLY SayHello
FROM 'C:/SQL2005Demo/CH13/SayHello/SayHello/bin/SayHello.dll'
WITH permission_set = Safe; |
GO ﹂──>组件的位置路径
-- 建立一个会参考所登录之组件 SayHello.dll 的存储过程
CREATE PROCEDURE dbo.SayHello
(
@Greeting nvarchar(80) OUTPUT
)
AS EXTERNAL NAME SayHello.[SayHello.SayHelloClass].SayHello;
GO ↓
[ 命名空间 . 类别名称 ]
14.
请您继续于
SQL Server Management Studio
中执行以下的程序代码,以便尝试执行我们所建立的
CLR
存储过程(执行结果如图表
6
所示):
USE 北风贸易 ;
GO
EXEC sp_configure 'clr enabled', '1';
GO
RECONFIGURE;
GO
DECLARE @return_value int, @Greeting nvarchar(80);
-- 执行 CLR 存储过程并取得传回值与输出变量的值
EXECUTE @return_value = dbo.SayHello
@Greeting = @Greeting OUTPUT;
-- 检视传回值与输出变数的值
SELECT @return_value AS 传回值 ,
@Greeting AS " 输出参数 @Greeting 之值 ";
USE 北风贸易 ;
GO
EXEC sp_configure 'clr enabled', '1';
GO
RECONFIGURE;
GO
DECLARE @return_value int, @Greeting nvarchar(80);
-- 执行 CLR 存储过程并取得传回值与输出变量的值
EXECUTE @return_value = dbo.SayHello
@Greeting = @Greeting OUTPUT;
-- 检视传回值与输出变数的值
SELECT @return_value AS 传回值 ,
@Greeting AS " 输出参数 @Greeting 之值 ";

图表
6

评论
好文啊,收藏了
转http://www.cnblogs.com/liminzhang/archive/2007/01/12/618324.html存储过程」(StoredProcedures)是SQLServer...
[引用提示]WOW玩家引用了该文章, 地址: http://www.cnblogs.com/genson/archive/2007/01/12/618493.html 回复 引用 查看
[引用提示]WOW玩家引用了该文章, 地址: http://www.cnblogs.com/genson/archive/2007/01/12/618493.html 回复 引用 查看
#4楼 [未注册] 2007-01-12 11:36 fds2003[匿名]
SQLServer2005-实作CLR存储过程
[引用提示]yueue引用了该文章, 地址: http://www.cnblogs.com/yueue/archive/2007/01/17/623044.html 回复 引用 查看
[引用提示]yueue引用了该文章, 地址: http://www.cnblogs.com/yueue/archive/2007/01/17/623044.html 回复 引用 查看
呵呵,我个人不认为这个东西在事务操作中有多大意义。
SQL2005刚出来时,我也研究了几个星期的CLR集成,写了一堆CLR存储过程,最后发现:没法控制参数的精度,比如说你希望输入参数是NVARCHAR(40)的,在CLR过程中你只能声明SqlString,最后反应到数据库中将是NVARCHAR(4000),这个问题还不大,但是如果你使用的是DECIMAL(10, 4),你也只能使用SqlDecimal,你将发现数据库中参数是NUMERIC(18, 0)。这样的话,你能怎么办呢?嘎嘎。
而且根据国外测试的结果,一旦SQL过程数量达到一个阀值,数据库性能会指数级下降。这样的结果你满意吗?
嘎嘎。不要轻易相信这些东西。在我看来,CLR存储过程只有几个特定的环境可以用:一、和系统的某些操作挂钩,比如说调用API,根据数据库数据执行非数据库操作时;二、控制复杂的记录集循环以执行运算。
象文章里写的那些,只有两个字形容——垃圾。 回复 引用 查看
SQL2005刚出来时,我也研究了几个星期的CLR集成,写了一堆CLR存储过程,最后发现:没法控制参数的精度,比如说你希望输入参数是NVARCHAR(40)的,在CLR过程中你只能声明SqlString,最后反应到数据库中将是NVARCHAR(4000),这个问题还不大,但是如果你使用的是DECIMAL(10, 4),你也只能使用SqlDecimal,你将发现数据库中参数是NUMERIC(18, 0)。这样的话,你能怎么办呢?嘎嘎。
而且根据国外测试的结果,一旦SQL过程数量达到一个阀值,数据库性能会指数级下降。这样的结果你满意吗?
嘎嘎。不要轻易相信这些东西。在我看来,CLR存储过程只有几个特定的环境可以用:一、和系统的某些操作挂钩,比如说调用API,根据数据库数据执行非数据库操作时;二、控制复杂的记录集循环以执行运算。
象文章里写的那些,只有两个字形容——垃圾。 回复 引用 查看
msdn中倡导的clr 存储过程的使用原则是在使用复杂的过程操作的时候采用,并且能够利用上.net framework里的内置函数,其性能要比面向查询的t-sql语言处理过程逻辑要好上好多。
回复
引用
查看
老师。向您请教一个问题。
我现在用SQL CLR 把一个程序集放到SQL 2005中。
但有一个问题。没有解决
就是连接字符串的问题。
现在的程序是把它写死在程序里。也就是数据库一变就要改程序。
后来改为读C:/下的一个指定文件 。这样是可以改变Constring的。
但是如果同一台服务器上有多个服务器里面部属了程序也是不可以用。
还有clr 自还的那个 具体怎么写忘了。
usering(....)
这个我没试过。因为我的程序集的低层是用sqlheper做的。这样改的话工做量太多了。
有没有好一点的办法呢?
不知道章老师有时间不。可以聊聊嘛
我的QQ:89148614
我现在用SQL CLR 把一个程序集放到SQL 2005中。
但有一个问题。没有解决
就是连接字符串的问题。
现在的程序是把它写死在程序里。也就是数据库一变就要改程序。
后来改为读C:/下的一个指定文件 。这样是可以改变Constring的。
但是如果同一台服务器上有多个服务器里面部属了程序也是不可以用。
还有clr 自还的那个 具体怎么写忘了。
usering(....)
这个我没试过。因为我的程序集的低层是用sqlheper做的。这样改的话工做量太多了。
有没有好一点的办法呢?
不知道章老师有时间不。可以聊聊嘛
我的QQ:89148614