部署和调试 CLR 存储过程






2.50/5 (6投票s)
2006年10月15日
3分钟阅读

47370
本文将指导您如何部署和调试 CLR 存储过程
引言
大家好,
这里有一些关于部署和调试 CLR 存储过程的酷炫内容,我将在此介绍如何使用 VS 2005 部署和调试 CLR 存储过程。
我建议在阅读本文之前,请先阅读我之前的文章,名为“CLR 存储过程与 T-SQL 存储过程”和“如何创建 CLR 存储过程”。
1. 部署 CLR 存储过程时,您必须拥有“CREATE ASSEMBLY”权限。一旦部署到 SQL Server 上,您就可以在那里看到并执行 CLR 存储过程,如下所示。
2. 在 VS 2005 中创建 CLR 存储过程时,您可能会看到“Test Script”文件夹。该文件夹包含“Test.sql”文件,如果您打开并查看该文件,它会包含针对特定任务(如执行存储过程、用户定义函数等)的各个部分。此脚本文件纯粹用于调试目的。请按照以下步骤调试 CLR 存储过程。
调试 CLR 存储过程的步骤,
a. 打开“Test.sql”文件,并将以下代码添加到文件末尾。
EXEC dbo.GetRoles
-- 在名为“如何创建 CLR 存储过程”的前一篇文章中创建
EXEC dbo.PrintDate 'This will go into txt file'
b. “PrintDate”存储过程访问外部资源,如文件系统。此存储过程正在写入一个文件。访问外部资源时,需要“TRUSTWORTHY”权限。
c. 执行以下命令以获得“TRUSTWORTHY”权限。
ALTER DATABASE Database_Name SET TRUSTWORTHY ON
d. 以下是“PrintDate”CLR 存储过程的代码。
[Microsoft.SqlServer.Server.SqlProcedure]
public static void PrintDate(string name)
{
SqlPipe p;
p = SqlContext.Pipe;
FileIOPermission filePerm = new FileIOPermission(FileIOPermissionAccess.AllAccess, @"C:\TestFile.txt");
filePerm.Assert();
StreamWriter sw = new StreamWriter(@"C:\TestFile.txt");
sw.WriteLine(name);
sw.Flush();
sw.Close();
p.Send(System.DateTime.Today.ToString());
using (SqlConnection connection = new
SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT * FROM Department", connection);
SqlDataReader reader = command.ExecuteReader();
reader.Read();
SqlContext.Pipe.Send(reader);
}
}
e. 由于“PrintDate”CLR 存储过程访问外部资源,如上所述,我们需要在部署 CLR 存储过程之前,在 VS 2005 中纳入此更改,如下所示。以下屏幕显示将“Permission Level”设置为“External”。
f. 现在我假设您已成功部署 CLR 存储过程,并在“Test.sql”中纳入了相应的执行命令。
g. 在“PrintDate”函数中设置断点,然后在 VS 2005 中运行应用程序。应用程序会在断点处停止,就像任何 .NET 应用程序一样。
h. 执行完成后,您可以看到“TestFile.txt”文件已生成,其中包含作为输入参数传递给 CLR 存储过程的文本,查看“Output”窗口,其中包含“GetRole”CLR 存储过程的结果以及“PrintDate”函数的 SQL 语句 "SELECT * FROM Department" ,如下所示。
3. 要启用 SQL Server 上的 CLR,请在特定数据库上执行以下查询。
EXEC sp_configure 'show advanced options' , '1';
go
reconfigure;
go
EXEC sp_configure 'clr enabled' , '1'
go
reconfigure;
-- 将高级选项重新关闭
EXEC sp_configure 'show advanced options' , '1';
go