【问题标题】:SQL Server debuggingSQL 服务器调试
【发布时间】:2022-12-18 09:29:33
【问题描述】:

我想问一下是否有可能在程序中使用一些调试选项?

在我使用 Visual Studio 之前,我可以使用F5键开始调试。我也可以用 SQL 来做吗?

当我试图解决一些查询或查看后面的程序步骤时,我想查看运行过程中的步骤

【问题讨论】:

  • 在 SSDT 中是,在 SSMS 中不是(SSMS 18 中删除了调试器)。
  • 即使包含在内,设置它并使其实际工作通常也需要费点功夫,即使对于本地服务器也是如此,更不用说远程服务器了。将您的查询分解为您自己的步骤并编写它们,以便通过使用 CTE 轻松地对它们进行部分检查,这样更不会令人沮丧并且更可靠。您唯一缺少的是执行存储过程时的参数值,您可以通过客户端日志记录或探查器/扩展事件跟踪获得这些值。

标签: sql-server debugging


【解决方案1】:

我曾经使用此过程中的格式在整个过程中打印消息。还可以防止向应用程序发送消息。它检查它是否是生产服务器。 (使用设置表)。

CREATE PROCEDURE dba.Usp_Util_TraceLog
    @ProcId INT, @Message NVARCHAR(4000) = '', @Param0 NVARCHAR(255) = NULL, @Param1 NVARCHAR(255) = NULL, @Param2 NVARCHAR(255) = NULL, @Param3 NVARCHAR(255) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    IF (mon.fn_Setting_Get('is_production_envirement') = 1)
        RETURN;

    SET @Param0 = ISNULL(@Param0, '');
    SET @Param1 = ISNULL(@Param1, '');
    SET @Param2 = ISNULL(@Param2, '');
    SET @Param3 = ISNULL(@Param3, '');

    SET @Message = REPLACE(@Message, '{0}', @Param0);
    SET @Message = REPLACE(@Message, '{1}', @Param1);
    SET @Message = REPLACE(@Message, '{2}', @Param2);
    SET @Message = REPLACE(@Message, '{3}', @Param3);

    DECLARE @proc_name sysname;
    DECLARE @schema_name sysname;
    SELECT @proc_name = o.name, @schema_name = s.name
    FROM sys.objects AS o
        INNER JOIN sys.schemas AS s ON s.schema_id = o.schema_id
    WHERE o.object_id = @ProcId;
    
    DECLARE @msg NVARCHAR(4000)= CONCAT('[', @schema_name, '].[', @proc_name, ']: ', @Message)

    PRINT @msg;
END;
GO

【讨论】:

    【解决方案2】:

    总的来说,遍历代码、逐行手动推进执行、使用断点和显示当前变量内容的窗口的调试风格不适合数据库工作。如果做得好,这意味着在您遍历代码时创建并持有锁,并且取决于环境(当然,我们中没有人会在生产环境中这样做),这可能会导致严重的阻塞问题。此外,查看临时表的内容可能会出现很大问题。

    正如其他人已经说过并且可能会说的那样,您最好一次手动设置输入值并运行选定的代码块,使用 PRINT 和 SELECT 语句显示在任何给定点发生的事情。这可能很慢,有点笨拙,但非常有效。

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 2010-10-16
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多