Share via


如何:通过使用公共语言运行时集成创建和运行 SQL Server 存储过程

通过将**“存储过程”**项添加到 SQL Server 公共语言运行时 (SQL CLR) 数据库项目,从而创建 SQL 存储过程。 成功部署到运行 SQL Server 的计算机之后,可以像调用和执行任何其他存储过程一样调用和执行用托管代码创建的存储过程。

提示

显示的对话框和菜单命令可能会与帮助中描述的那些有所不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置

创建 SQL Server 存储过程

创建 SQL Server 存储过程

  1. 打开一个现有的 SQL CLR 数据库项目,或者创建一个新项目。 有关更多信息,请参见如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目

  2. 在**“项目”菜单上选择“添加新项”**。

  3. 在**“添加新项”对话框中选择“存储过程”**。

  4. 键入新存储过程的**“名称”**。

  5. 添加执行存储过程时要运行的代码。 请参见此过程后面的第一个示例。

  6. 在**“解决方案资源管理器”中打开“TestScripts”**文件夹,并双击 Test.sql 文件。

    提示

    您可以将其他脚本指定为默认调试脚本。 有关更多信息,请参见如何:编辑 Test.sql 脚本以运行使用 SQL Server 公共语言运行时集成的对象

  7. 将代码添加到 Test.sql 文件中以执行存储过程。 请参见此过程后面的第二个示例。

  8. 按 F5 生成、部署并调试该存储过程。 有关如何不进行调试而直接部署的信息,请参见如何:将 SQL CLR 数据库项目项部署到 SQL Server

    重要说明重要事项

    SQL Server 2005 和 SQL Server 2008 只支持使用 .NET Framework 2.0、3.0 或 3.5 版生成的 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(在进行校验是您要部署的程序集的名称)。 有关更多信息,请参见如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目

  9. 查看结果“输出”窗口和选择显示输出: 数据库输出

示例

下面的代码示例创建一个存储过程,向 Adventure Works 示例数据库的 Currency 表中插入一条记录。 并在创建了该存储过程之后,将其部署到 SQL Server。 有关更多信息,请参见如何:将 SQL CLR 数据库项目项部署到 SQL Server

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();
        }
    }
}

将执行和测试存储过程的代码添加到 Test.sql 文件,该文件位于项目的**“TestScripts”**文件夹中。 例如,如果部署了一个存储过程,则可以通过调用 EXEC <StoredProcedureName> 并传入任何预期的参数来运行该过程。 如果存储过程未返回任何值,请另外插入一段代码以验证存储过程是否对数据产生影响。

提示

如果使用 Visual C# 创建了示例,请用 InsertCurrency_CS 替代以下示例中的存储过程名称。

EXEC InsertCurrency 'AAA', 'Currency Test'
SELECT * from Sales.Currency where CurrencyCode = 'AAA'

请参见

任务

如何:为使用 SQL Server 公共语言运行时集成的数据库对象创建项目

如何:通过使用公共语言运行时集成创建和运行 SQL Server 触发器

如何:通过使用公共语言运行时集成创建和运行 SQL Server 聚合

如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的函数

如何:通过使用公共语言运行时集成创建和运行 SQL Server 用户定义的类型

演练:使用托管代码创建存储过程

如何:调试 SQL CLR 存储过程

参考

SQL CLR 数据库项目和数据库对象的特性

概念

SQL Server CLR 集成简介 (ADO.NET)

使用托管代码创建数据库对象的好处

开始引用 SQLCLR 对象的数据库的团队开发

在托管代码中创建 SQL Server 对象

其他资源

SQL CLR Database Debugging