调试 CLR 数据库对象

SQL Server 支持在数据库中调试 Transact-SQL 和公共语言运行时 (CLR) 对象。 SQL Server 中调试的关键方面是易于设置和使用,以及 SQL Server 调试器与 Microsoft Visual Studio 调试器的集成。 此外,调试可跨语言工作。 用户可以从 Transact-SQL 无缝单步执行 CLR 对象,反之亦然。 SQL Server Management Studio 中的 Transact-SQL 调试器不能用于调试托管数据库对象,但可以使用 Visual Studio 中的调试器来调试对象。 Visual Studio 中的托管数据库对象调试支持在服务器上执行的例程中的所有常见调试功能,例如“单步执行”和“单步执行”语句。 调试器可以在调试时设置断点、检查调用堆栈、检查变量和修改变量值。 请注意,Visual Studio .NET 2003 不能用于 CLR 集成编程或调试。 SQL Server 包括预安装的 .NET Framework,Visual Studio .NET 2003 无法使用 .NET Framework 2.0 程序集。

有关使用 Visual Studio 调试托管代码的详细信息,请参阅 Visual Studio 文档中的“调试托管代码”主题。

调试权限和限制

调试是一项高度特权的作,因此仅允许在 SQL Server 中执行 sysadmin 固定服务器角色的成员。

调试时应用以下限制:

  • 调试 CLR 例程一次限制为一个调试器实例。 此限制适用,因为当命中断点和执行时,所有 CLR 代码执行都会冻结,直到调试器从断点前进为止。 但是,可以继续在其他连接中调试 Transact-SQL。 尽管 Transact-SQL 调试不会冻结服务器上的其他执行,但它可能会导致其他连接通过持有锁等待。

  • 无法调试现有连接,只有新连接,因为 SQL Server 需要有关客户端和调试器环境的信息,然后才能建立连接。

由于上述限制,我们建议在测试服务器上调试 Transact-SQL 和 CLR 代码,而不是在生产服务器上进行调试。

调试托管数据库对象的概述

SQL Server 中的调试遵循每个连接模型。 调试器只能检测和调试其附加到的客户端连接的活动。 由于调试器的功能不受连接类型的限制,因此可以调试表格数据流(TDS)和 HTTP 连接。 但是,SQL Server 不允许调试现有连接。 调试支持服务器上执行的例程中的所有常见调试功能。 调试器与 SQL Server 之间的交互通过分布式组件对象模型 (COM) 进行。

有关调试托管存储过程、函数、触发器、用户定义的类型和聚合的详细信息和方案,请参阅 Visual Studio 文档中的“SQL Server CLR 集成数据库调试”主题。

必须在 SQL Server 实例上启用 TCP/IP 网络协议,才能使用 Visual Studio 进行远程开发、调试和开发。 有关在服务器上启用 TCP/IP 协议的详细信息,请参阅 配置客户端协议

调试托管数据库对象

  1. 打开Microsoft Visual Studio,创建新的 SQL Server 项目,并建立与 SQL Server 实例上的数据库的连接。

  2. 创建新类型。 在解决方案资源管理器中,右键单击项目,选择“添加”和“新建项...”在“添加新项”窗口中,选择“存储过程”、“ User-Defined 函数”、“User-Defined 类型”、“触发器”、“聚合”或“类”。 为新类型的源文件指定名称,然后单击“ 添加”。

  3. 将新类型的代码添加到文本编辑器。 有关示例存储过程的示例代码,请参阅本主题后面的部分。

  4. 添加用于测试类型的脚本。 在 解决方案资源管理器中,展开 TestScripts 目录双击 Test.sql 打开默认测试脚本源文件。 将测试脚本(调用要调试的代码)添加到文本编辑器。 有关示例脚本,请参阅下文。

  5. 在源代码中放置一个或多个断点。 在文本编辑器中右键单击要调试的函数或例程中的代码行,然后选择“ 断点 ”和 “插入断点”。 将添加断点,突出显示红色代码行。

  6. “调试 ”菜单中,选择“ 开始调试 ”以编译、部署和测试项目。 将运行Test.sql中的测试脚本,并调用托管数据库对象。

  7. 指定指令指针的黄色箭头显示在断点代码执行暂停时,可以开始调试托管数据库对象。 可以从“调试”菜单单步执行,将指令指针前进到下一行代码。 “ 局部变量 ”窗口用于观察指令指针当前突出显示的对象的状态。 变量可以添加到 “监视 ”窗口。 监视变量的状态可以在整个调试会话中观察,而不仅仅是当变量位于当前通过指令指针突出显示的代码行中时。 从“调试”菜单中选择“继续”,将指令指针前进到下一个断点或完成例程的执行(如果没有其他断点)。

示例:

以下示例将 SQL Server 版本返回到调用方。

C#(编程语言)

using System;  
using System.Data;  
using System.Data.SqlTypes;  
using System.Data.SqlClient;  
using Microsoft.SqlServer.Server;   
  
public class StoredProcedures   
{  
   [Microsoft.SqlServer.Server.SqlProcedure]  
   public static void GetVersion()  
   {  
   using(SqlConnection connection = new SqlConnection("context connection=true"))   
   {  
      connection.Open();  
      SqlCommand command = new SqlCommand("select @@version",  
                                           connection);  
      SqlContext.Pipe.ExecuteAndSend(command);  
      }  
   }  
}  

Visual Basic

Imports System  
Imports System.Data  
Imports System.Data.Sql  
Imports System.Data.SqlTypes  
Imports Microsoft.SqlServer.Server  
Imports System.Data.SqlClient  
  
Partial Public Class StoredProcedures   
    <Microsoft.SqlServer.Server.SqlProcedure> _  
    Public Shared Sub GetVersion()  
        Using connection As New SqlConnection("context connection=true")  
            connection.Open()  
            Dim command As New SqlCommand("SELECT @@VERSION", connection)  
            SqlContext.Pipe.ExecuteAndSend(command)  
        End Using  
    End Sub  
End Class  

下面是调用上面定义的 GetVersion 存储过程的测试脚本。

EXEC GetVersion  

另请参阅

公共语言运行时 (CLR) 集成编程概念