首页 > 解决方案 > 如何记录存储过程调用的详细信息?

问题描述

在我当前的项目中,我们遇到了可以通过了解正在进行的调用以及它们各自的参数来非常容易调试的问题(在我们的开发环境中)。为了实现这一点,我建立了一个存储 PROC 名称的表,以及一些包含调用它的所有参数的任意 JSON blob。我也在存储通话时间,但这无关紧要。

以下是我发现填充此表的唯一方法:

    DECLARE @prmJson NVARCHAR(MAX) = (  SELECT * FROM (VALUES       
            ('@userId'              ,   @userId                )
        ,   ('@baiCodeMerchantId'   ,   @baiCodeMerchantId     )
        ,   ('@baiCodeMerchantType' ,   @baiCodeMerchantType   )
        ,   ('@appliedAccountId'    ,   @appliedAccountId      )
        ,   ('@unappliedAccountId'  ,   @unappliedAccountId    )) AS P(Name, Value) FOR JSON AUTO);
    INSERT INTO History.SprocCallRecords ([SprocName], [ParametersJson])
    VALUES (QUOTENAME(OBJECT_NAME(@@PROCID)), @prmJson);

我的问题是,这是要添加到每个过程中的大量代码。我宁愿能够反映范围内的值,或者能够调用一些类似 C# 的 nameof() 方法。虽然我显然将其他语言投射到 tSQL 上,但我非常想在将它集成到任何地方之前简化这个样板。

大多数情况下,我正在寻找建议,但我在 Google RE 上找不到太多建议:正是这个。

提前感谢您的任何帮助!

标签: sql-servertsql

解决方案


您可以动态调用存储过程,因此您将能够将每次调用保存到某个日志表。

例子:

    DECLARE 
    @param1 nvarchar(50),
    @param2 nvarchar(50),
    @param3 nvarchar(50)

SET @param1 = 'value of param 1'
SET @param2 = 'value of param 2'
SET @param3 = 'value of param 3'

DECLARE @sp_text nvarchar(2000)
SET @sp_text = 'exec some_sp ''' + @param1 + ''', ''' + @param2 + ''', ''' + @param3 + ''''

INSERT INTO Executions_Log_Table(Execution_DT, SP_Call) SELECT GetDate(), @sp_text
EXEC(@sp_text)

希望能帮到你


推荐阅读