Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用执行字符串记录SQL错误_Sql_Sql Server_String_Logging_Execution - Fatal编程技术网

使用执行字符串记录SQL错误

使用执行字符串记录SQL错误,sql,sql-server,string,logging,execution,Sql,Sql Server,String,Logging,Execution,我一直在搜索,似乎找不到从catch中记录执行字符串的答案。我使用了许多存储过程,我希望在发生错误时将错误信息和执行字符串记录到表中。例如,我有一个表: CREATE TABLE dev_error ( error_number INT, error_procedure NVARCHAR(500), error_message NVARCHAR(MAX), .... procedure_call NVARCHAR(MAX) ) 我希望能够将用于调用过程的执行字符串插入到过程调用字段中,但我很难

我一直在搜索,似乎找不到从catch中记录执行字符串的答案。我使用了许多存储过程,我希望在发生错误时将错误信息和执行字符串记录到表中。例如,我有一个表:

CREATE TABLE dev_error
(
error_number INT,
error_procedure NVARCHAR(500),
error_message NVARCHAR(MAX),
....
procedure_call NVARCHAR(MAX)
)

我希望能够将用于调用过程的执行字符串插入到过程调用字段中,但我很难找到答案。我曾尝试使用sys.parameters拉取参数并创建字符串,但无法将变量扩展到它所持有的实际值。有没有人对我实现这一点有什么见解。

实际上,我是通过写入文件来实现的,但当您想插入到表中时,您可以这样做

CREATE PROCEDURE [dbo].[Procedure1]
    @Param1 AS VARCHAR(10)
    ,@Param2 AS INT
    ,@Param3 AS DATE
    ,@Param4 AS MONEY
AS
BEGIN
BEGIN TRY
    // Procedure Body
END TRY
BEGIN CATCH
    DECLARE @Error_Params AS VARCHAR(MAX) = (SELECT ' @Param1 = ' + @Param1 + ', @Param2 = ' + CAST(@Param2 AS VARCHAR(250)) + ', @Param3 = ' + CAST(@Param3 AS VARCHAR(250)) +', @Param4 = ' + CAST(@Param4 AS VARCHAR(250)))
    INSERT INTO dev_error
    SELECT ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(), @Error_Params
END CATCH
END

您可能不需要过程调用来记录日志。U将使用错误\ U procedure()获取过程名称。只要通过连接输入参数来创建一个字符串,我希望它能够动态执行,这样我就可以在任何过程中输入它。我可以在一个调用中静态地执行此操作,但我想将此逻辑复制到一系列过程中。在不知道输入/输出参数的情况下动态创建此操作的任何想法。我想动态生成它们,以便在多个过程中使用。是的,这是可以做到的。但你到底为什么要这么做?在所有SP的捕获块中,它不是更灵活、优化和结构良好的方式吗?此外,如果您没有在所有sp中执行此操作,您将如何从错误记录sp中找到导致异常的另一个sp?