Transact-SQL 调试限制

本主题适用于:

Visual Studio 旗舰版

Visual Studio 高级专业版

Visual Studio 专业版

Visual Studio 速成版

kkyhd4yb.DoesApplybmp(zh-cn,VS.100).gif kkyhd4yb.DoesApplybmp(zh-cn,VS.100).gif kkyhd4yb.DoesApplybmp(zh-cn,VS.100).gif kkyhd4yb.DoesNotApplybmp(zh-cn,VS.100).gif

当通过 Visual Studio 调试器和从 SQL Server 2005 开始的 SQL Server 调试 Transact-SQL 时,需注意一些一般限制条件。有关通过 SQL Server Management Studio 来调试 Transact-SQL 的更多信息,请参见使用 Transact-SQL 调试器(可能为英文网页)。

多层 SQL 调试

  • 调试多层应用程序时,不能使用**“单步执行”从应用程序层(C#、Visual Basic 或 C++)中的代码进入并单步执行 SQL Server 实例上的代码(Transact-SQL 或 SQL/CLR)。或者,在存储过程代码中设置断点,并按“继续”(或 F5)执行代码,直到出现断点。如果不使用断点,还可以使用“运行至光标处”**到达所需的点。请注意,在 SQL Server 层内,您可以在 Transact-SQL 和 SQL/CLR 代码之间来回切换。

  • 也不能从存储过程代码返回到调用该存储过程的层上的代码。如果希望在返回到应用程序层后继续调试,请在存储过程调用点之后的应用程序代码中设置断点。

  • 连接池是一种改善性能的技术。当应用程序关闭其数据连接时,SQL Server 连接不会完全关闭,而是保留在池中,这样如果应用程序以后尝试重新打开连接时,就可以重新使用该连接。然而,通过连接池重新建立连接时,不会重新启用 Transact-SQL 调试。

    应在调试时暂时禁用连接池。为此,请在用于连接到 SQL Server 实例的连接字符串中设置“Pooling=false”。完成调试后,请从连接字符串中删除此特性,并默认启用池。

  • 通过对 SQL Server 使用**“.NET Framework 数据访问接口”,托管应用程序可以连接到 SQL Server 数据源,这与连接到“OLE DB”“ODBC”**相比可以提供更好的性能。在同一个调试器会话中,可同时执行托管调试和 Transact-SQL 调试。

    如果托管应用程序正在运行,且您使用调试器附加到该应用程序,则可以选择要执行的调试类型。如果要执行 Transact-SQL 调试,则必须选择 Transact-SQL 调试,而要调试 SQL/CLR 代码,还必须指定托管调试。

  • 您可以在附加到正在运行的应用程序之后执行 Transact-SQL 调试。但请注意,仅可以调试在完成**“附加”**操作后创建的那些数据库连接。因此,如果应用程序调用需要花很长时间处理的存储过程,则不能附加到调用该存储过程的连接,而只能附加到与该应用程序建立连接后调用存储过程的新连接。

  • 如果通过与 OleDbDataAdapter 建立连接来进行调试,则在命中断点后等待重要时间时导致连接超时。如果经过此超时时间后尝试继续进行调试(例如,从**“调试”菜单中选择“继续”**),调试器将退出(而不是继续执行)。此行为在预期之中。调试器退出是因为 OleDbDataAdapter 与 SqlDataAdapter 不同,它不会在发生超时后引发异常。若要解决此问题,请在使用 OleDbDataAdapter 时将超时值设置为较高值。

    有关为 .NET Framework 数据访问接口设置超时值的更多信息,请参见 .NET Framework 类库文档中的 OleDbCommand.CommandTimeout 属性SqlCommand.CommandTimeout 属性

其他限制

  • 触发器必须在激发后才能进行调试:不能直接调试触发器。相反,请在导致触发器激发的存储过程中启动调试。

  • 在运行时调试中,有一系列的嵌套 select 语句(例如,在联合中)可以填充网络缓冲区。这会导致平常运行良好的代码在调试期间暂停。若要获取更多数据,请使用 RecordSet.MoveNext 和 RecordSet.NextRecordSet。

  • 如果存储过程的名称包含引号,则可能会收到调试器错误消息。有关更多信息,请参见调试名称包含引号的过程时出错

  • 缓存值不会自动修改。不能期望由 Transact-SQL 解释器缓存的局部变量或参数更改总是在逐句通过 Transact-SQL 语句的时间范围内生效。尽管您可以修改该值,但或许再也无法对其进行检查。不能强制刷新缓存值。缓存值的存在是因为 SQL Server 执行计划决定了无法为每一个语句执行或引用都动态地加载一些变量的值。有关更多信息,请在 SQL Server 文档中搜索“SHOWPLAN”。

  • 不能在调试存储过程的同时附加到本机的 SQL Server 进程。

请参阅

概念

调试 Transact-SQL

调试器命令和功能的限制

其他资源

Debugger Security