如何:调试 SQL CLR 存储过程

更新:2007 年 11 月

本主题适用于:

版本

Visual Basic

C#

C++

Web Developer

速成版

主题不适用 主题不适用 主题不适用 主题不适用

标准版

主题不适用 主题不适用 主题不适用 主题不适用

专业团队版

主题适用 主题适用 主题适用 主题适用

表格图例:

主题适用

适用

主题不适用

不适用

主题适用,但命令默认情况下隐藏

默认情况下隐藏的一条或多条命令。

您可以按照调试 T-SQL 过程的方式,通过使用直接数据库调试来调试现有的 SQL CLR 存储过程。但是,如果需要创建或修改 SQL CLR 过程,则不能那样做,因为您需要编译和部署该过程。这些步骤对于 T-SQL 过程是不存在的。在这种情况下,需要在 Visual Studio 中创建 SQL Server 项目。

以下任务在 Adventureworks 数据库(与 SQL Server 2005 一起安装的数据库之一)中创建新的 SQL CLR 存储过程,然后演示如何调试该过程。您将创建一个向 Sales.Currency 表中添加一种新货币的存储过程。

本示例重点介绍 SQL Server 项目的内部调试。一旦创建了存储过程,就可以使用直接数据库调试来调试该存储过程。有关更多信息,请参见 如何:使用服务器资源管理器单步执行对象

说明:

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

调试 SQL CLR 存储过程

  1. 在新的 SQL Server 项目中,建立一个到 AdventureWorks 示例数据库的连接。有关更多信息,请参见 如何:连接到数据库

  2. 使用下面第一个示例部分中的代码创建一个新的存储过程,并将它命名为“InsertCurrency.cs”。有关更多信息,请参见 如何:使用 SQL Server 项目类型进行开发

  3. 添加一个通过调用该存储过程来测试它的脚本。在“解决方案资源管理器”中右击“TestScripts”目录,单击“添加测试脚本”,然后插入下面第二个示例部分中的代码。以名称“InsertCurrency.sql”保存文件。右击该文件名,然后单击“设置为默认调试脚本”。

  4. 在 InsertCurrency.cs 中设置断点,然后在“调试”菜单上单击“启动”以对该项目进行编译、部署和单元测试。以黄色箭头表示的说明性指针在断点上显示时,说明正在调试存储过程。

  5. 尝试各种调试功能。

    1. 打开“局部变量”窗口,并在“调试”菜单上单击“单步执行”以单步执行存储过程中的一行。注意,“局部变量”窗口中的变量 @mynvarchar 的值已经更改,并且它的值现在显示为红色,表示它已经更改。有关更多信息,请参见使用“局部变量”窗口

      说明:

      服务器可能不会反映在调试器窗口中对变量值的更改。有关更多信息,请参见 SQL 调试限制

    2. 打开“监视”窗口。在“文本编辑器”中,拖动 InsertCurrencyCommand 变量到“监视”窗口中的任意位置。

      该变量随即添加到受监视的变量列表中。有关更多信息,请参见如何:使用调试器变量窗口

      注意 也可以在“监视”窗口中编辑变量的值。

    3. 在文本编辑器中,右击 InsertCurrencyCommand.ExecuteNonQuery 行并在快捷菜单上单击“插入断点”。

    4. 在“调试”菜单中单击“继续”,调试器将运行代码直到新的断点。

  6. 再次单击“继续”完成对存储过程的调试。

    “输出”窗口会显示一条消息,表明已成功部署存储过程,并会显示执行 InsertCurrency.sql 文件中的命令的结果。

示例

用此代码替换存储过程模板。

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;

public partial class StoredProcedures
{
    [SqlProcedure]
    public static void InsertCurrency(SqlString currencyCode, 
                                               SqlString name)
    {
        using(SqlConnection conn = new SqlConnection("context connection=true")) {
        SqlCommand cmd = new SqlCommand([your SQL statement], conn);
        }
        InsertCurrencyCommand.CommandText = "insert Sales.Currency"
                     + " (CurrencyCode, Name, ModifiedDate) values('" 
                     + currencyCode.ToString() + "', '" 
                     + name.ToString() + "', '" 
                     + DateTime.Now.ToString() + "')";
        InsertCurrencyCommand.ExecuteNonQuery();
    }
}

这是用于执行存储过程的测试脚本。

- Delete any row that might exist with a key value
- that matches the one we are going to insert
DELETE Sales.Currency
WHERE CurrencyCode = 'eee'
EXEC InsertCurrency 'eee', 'MyCurr4'
SELECT * FROM Sales.Currency WHERE CurrencyCode = 'eee'

请参见

任务

如何:创建和运行 CLR SQL Server 存储过程

其他资源

SQL CLR 数据库调试