如何从分片数据库中捕获错误消息 - AzureSqlDB

时间:2017-08-17 08:18:51

标签: stored-procedures try-catch azure-sql-database

我有一个AzureSqlDB,它包含2个可能正在暂存和生产的数据库。我的Sp是在Staging中运行的,生产中的Sp使用 SP_EXECUTE_REMOTE 从我的临时数据库中调用Production sp。

最近我遇到了一个问题。当我打电话给我的主Sp时,我已经删除了生产数据库中的一些Sp。我无法捕获错误消息 无法找到存储过程' DBO.MY_PROD_SP'。'。

虽然我已经有了TRY CATCH BLOCK。但是因为它是Sp_Execute_REMOTE类型。我无法捕获此特定错误消息。

这是我在Stg DB中手动运行sp时得到的错误消息

  

消息46822,级别16,状态1,过程SP_EXECUTE_REMOTE,第1行   [Batch Start Line 16]从分片中检索数据时出错   [数据源= azure2017.database.windows.net   数据库= PRODUCTIONDB]。收到的基本错误消息是:   '找不到存储过程' DBO.MY_PROD_SP'。'。

请帮我解决问题。

更新1

这是我打电话给Sp。

的方式
CREATE TABLE #TEMP01(ERROR_MSG NVARCHAR(MAX),NAME NVARCHAR(MAX))
INSERT INTO #TEMP01
                EXEC SP_EXECUTE_REMOTE
                N'PROREMOTEREFERENCEDATA',
                N' DECLARE @ERROR_MSG VARCHAR(MAX)
                EXEC SP_EXECUTESQL  N'' EXEC DBO.[MY_PROD_SP] @ERROR_MSG OUTPUT'',
                N''@ERROR_MSG SYSNAME OUTPUT'',
                @ERROR_MSG OUTPUT
                SELECT @ERROR_MSG AS ERROR_MSG'                             


            SELECT @ERROR_MSG=ERROR_MSG FROM #TEMP01

通过这种方式,我可以在输出参数的Sp帮助中找回错误消息。但是,假设Sp被丢弃了。然后错误就像无法找到商店程序。在那种情况下,我无法使用error_msg来恢复我的错误描述。因为Sp本身在Pro数据库中不可用。

那么,在这种情况下,我怎么能够检索此错误消息?

先谢谢,
Jayendran

2 个答案:

答案 0 :(得分:0)

使用sp_executesql运行存储过程。 sp_executesql将返回无法找到的存储过程错误。

希望这有帮助。

此致

Alberto Morillo

答案 1 :(得分:0)

尝试以下内容:

    EXEC sp_execute_remote N'PROREMOTEREFERENCEDATA',
    N'BEGIN TRY
            DECLARE @ERROR_MSG VARCHAR(MAX)
            EXEC SP_EXECUTESQL  N'' EXEC DBO.[MY_PROD_SP] @ERROR_MSG OUTPUT'', N''@ERROR_MSG SYSNAME OUTPUT'', @ERROR_MSG OUTPUT
            SELECT @ERROR_MSG AS ERROR_MSG                             
    END TRY
    BEGIN CATCH
            SELECT ERROR_MESSAGE() AS ERROR_MSG; 
    END CATCH'

最好,
Sumeet