演练:使用托管代码创建存储过程
您可以通过 .NET Framework 语言(例如 Visual Basic 和 Visual C#),用托管代码编写 Microsoft SQL Server 2005 和 SQL Server 2008 数据库的存储过程。 用托管代码编写的存储过程称为 SQL Server 公共语言运行时存储过程(或 SQL CLR 存储过程)。
通过将**“存储过程”**项添加到 SQL CLR 数据库项目,可以创建 SQL 存储过程。 部署了用托管代码创建的存储过程之后,可以像调用和执行任何其他存储过程一样调用和执行这些过程。
本演练演示以下任务:
创建新的 SQL CLR 数据库项目
用托管代码创建一个存储过程
将该存储过程部署到 SQL Server 2008 数据库
创建一个脚本,以便对数据库测试存储过程
查询数据库中的数据,以确认存储过程是否执行正确
系统必备
若要完成本演练,您需要:
- 与运行于 SQL Server 2008 之上的 AdventureWorks2008 示例数据库的连接。 有关更多信息,请参见 Microsoft 网站上的 Microsoft SQL Server Product Samples(Microsoft SQL Server 产品示例)页。
创建项目
创建新的 SQL CLR 数据库项目
从**“文件”**菜单创建一个新的项目。
选择**“SQL CLR 数据库项目”,将项目命名为 SQLCLRStoredProcedure 并单击“确定”**。 有关更多信息,请参见如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目。
连接到 SQL Server 2008 数据库
此演练需要连接到运行于 SQL Server 2008 之上的 AdventureWorks2008 示例数据库。 如果**“服务器资源管理器”**中提供了与 AdventureWorks2008 示例数据库的连接,该连接将列在“添加数据库引用”对话框中。
连接到 AdventureWorks 示例数据库
完成**“添加连接”**对话框,从而连接到 SQL Server 2008 附带的 AdventureWorks2008 示例数据库。 有关更多信息,请参见添加/修改连接 (Microsoft SQL Server)。
- 或 -
在**“添加数据库引用”**对话框中选择与 AdventureWorks2008 示例数据库的现有连接。 有关更多信息,请参见“添加数据库引用”对话框。
配置 SQL CLR 数据库项目
创建 SQL CLR 数据库项目之后,您可能需要修改若干项目属性,然后才能成功部署项目。
为 SQL CLR 数据库项目配置属性
在“解决方案资源管理器”中,选择要为其配置属性的项目。
在**“项目”菜单上,单击“ProjectName 属性”**,其中 ProjectName 是您为 SQL CLR 数据库项目赋予的名称。
在**“应用程序”选项卡上的“程序集”**名称中,指定要为从 SQL CLR 数据库项目中生成的程序集赋予的名称。
在**“应用程序”选项卡上的“目标 Framework”**中,单击 SQL Server 的目标版本支持的 .NET Framework 的版本。
重要事项 SQL Server 2005 和 SQL Server 2008 只支持使用 .NET Framework 2.0 生成的 SQL Server 项目。 如果您尝试部署SQL Server项目,SQL Server 2005或SQL Server 2008,将显示错误消息: Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(在进行校验是您要部署的程序集的名称)。
在**“数据库”选项卡上的“程序集所有者”**中,键入作为程序集所有者的用户或角色的名称。
重要事项 此值必须是当前用户所属的角色的名称,或者是必须具有 IMPERSONATE 权限的当前用户的名称。 如果未指定程序集所有者,则所属权将授予当前用户。 此设置对应于 SQL Server CREATE ASSEMBLY 语句的 AUTHORIZATION 所有者名称 参数。 有关更多信息,请参见 Microsoft 网站上的 CREATE ASSEMBLY (Transact-SQL)。
在**“文件”菜单上,单击“全部保存”**。
创建 SQL Server 存储过程
创建了 SQL CRL 数据库项目后,向其中添加一个存储过程。
创建 SQL Server 存储过程
在**“项目”菜单上,单击“添加新项”**。
在**“添加新项”对话框中,选择“存储过程”**。
键入 InsertCurrency 作为新存储过程的**“名称”**。
单击**“添加”**。
使用以下代码替换代码编辑器中的代码:
Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server Partial Public Class StoredProcedures <SqlProcedure()> Public Shared Sub InsertCurrency( ByVal currencyCode As SqlString, ByVal name As SqlString) Using conn As New SqlConnection("context connection=true") Dim InsertCurrencyCommand As New SqlCommand() Dim currencyCodeParam As New SqlParameter("@CurrencyCode", SqlDbType.NVarChar) Dim nameParam As New SqlParameter("@Name", SqlDbType.NVarChar) currencyCodeParam.Value = currencyCode nameParam.Value = name InsertCurrencyCommand.Parameters.Add(currencyCodeParam) InsertCurrencyCommand.Parameters.Add(nameParam) InsertCurrencyCommand.CommandText = "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" & " VALUES(@CurrencyCode, @Name, GetDate())" InsertCurrencyCommand.Connection = conn conn.Open() InsertCurrencyCommand.ExecuteNonQuery() conn.Close() End Using End Sub End Class
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [SqlProcedure()] public static void InsertCurrency_CS( SqlString currencyCode, SqlString name) { using (SqlConnection conn = new SqlConnection("context connection=true")) { SqlCommand InsertCurrencyCommand = new SqlCommand(); SqlParameter currencyCodeParam = new SqlParameter("@CurrencyCode", SqlDbType.NVarChar); SqlParameter nameParam = new SqlParameter("@Name", SqlDbType.NVarChar); currencyCodeParam.Value = currencyCode; nameParam.Value = name; InsertCurrencyCommand.Parameters.Add(currencyCodeParam); InsertCurrencyCommand.Parameters.Add(nameParam); InsertCurrencyCommand.CommandText = "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" + " VALUES(@CurrencyCode, @Name, GetDate())"; InsertCurrencyCommand.Connection = conn; conn.Open(); InsertCurrencyCommand.ExecuteNonQuery(); conn.Close(); } } }
部署、执行和调试存储过程
创建新的存储过程后,可以通过按 F5 生成该存储过程,将其部署到 SQL Server 并进行调试。 首先,在位于项目的**“TestScripts”文件夹中的“Test.sql”**文件中,添加执行和测试存储过程的代码。 有关如何创建测试脚本的更多信息,请参见如何:编辑 Test.sql 脚本以运行使用 SQL Server 公共语言运行时集成的对象。
有关如何调试 SQL 的更多信息,请参见Debugging SQL Database Objects。
部署并运行 InsertCurrency 存储过程
在**“解决方案资源管理器”中展开“TestScripts”**文件夹,并双击 Test.sql 文件。
提示
您可以将其他脚本指定为默认调试脚本。 有关更多信息,请参见如何:编辑 Test.sql 脚本以运行使用 SQL Server 公共语言运行时集成的对象。
用下面的代码替换 Test.sql 文件中的代码:
'VB EXEC InsertCurrency 'AAA', 'Currency Test' SELECT * from Sales.Currency where CurrencyCode = 'AAA' //C# EXEC InsertCurrency_CS 'AAA', 'Currency Test' SELECT * from Sales.Currency where CurrencyCode = 'AAA'
按 F5 生成、部署并调试该存储过程。 有关如何不进行调试而直接部署的信息,请参见如何:将 SQL CLR 数据库项目项部署到 SQL Server。
查看所示的结果输出 窗口,然后选择 显示输出: 数据库输出。
请参见
任务
如何:通过使用公共语言运行时集成创建和运行 SQL Server 存储过程
如何:通过使用公共语言运行时集成创建和运行 SQL Server 触发器
如何:通过使用公共语言运行时集成创建和运行 SQL Server 聚合
如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的函数
如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的类型