SQL Server两柴

n7taea2i  于 2022-12-10  发布在  SQL Server
关注(0)|答案(2)|浏览(122)

我想问一下是否有可能在程序中使用一些调试选项?
在使用Visual Studio之前,我可以使用F5键来启动调试。我也可以使用SQL来启动调试吗?
当我试图解决一些查询或查看程序后面的步骤时,我希望查看运行过程中的步骤

vxf3dgd4

vxf3dgd41#

总的来说,这种调试风格不适合数据库工作,因为您需要遍历代码,手动逐行推进执行,并使用断点和窗口显示当前变量内容。正确地进行调试意味着在遍历代码时创建并保持锁,这取决于环境(当然,我们中没有人会在生产中这样做),这可能会导致严重的阻塞问题。此外,查看临时表的内容可能会有很大的问题。
正如其他人已经说过的,你最好手动设置输入值,并一次运行选定的代码块,用PRINT和SELECT语句显示在任何给定点发生的事情。这可能很慢,有点笨拙,但非常有效。

vjhs03f7

vjhs03f72#

我曾经用这个程序中的一种格式在整个程序中打印消息。也是为了防止向应用程序发送消息。它检查它是否是生产服务器。(使用设置表)。

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

相关问题