T-SQL:远程存储过程结果有时为空

问题描述 投票:0回答:1

我在调用远程存储过程时有一个奇怪的行为:通常它可以按预期工作,但有时我从存储过程中没有得到结果。

详细:我有两个存储过程。第一个调用第二个,由第三个调用,第二个由SQL Server Agent触发,但我将重点讨论#1和#2。

这里是存储过程#1(减少了一点):

CREATE PROCEDURE [dbo].[spCalculateForecast]
AS
BEGIN
    DECLARE @ForecastResult TABLE(
        [ProductId] INT NOT NULL,
        [Forecast30] DECIMAL(13,3) NOT NULL,
        [Forecast60] DECIMAL(13,3) NOT NULL,
        [Forecast90] DECIMAL(13,3) NOT NULL,
        [Forecast120] DECIMAL(13,3) NOT NULL
    )

    INSERT INTO @ForecastResult
        EXECUTE sp_execute_external_script
                @language = N'R',
                @script = N'

    DO SOME MAGIC

    OutputDataSet <- forecast.result
    ',
    @input_data_1 = N'
        SELECT *
        FROM Forecast_Data
        ORDER BY ProductId, Date',
    @input_data_1_name = N'forecast.data';

    IF NOT EXISTS (SELECT TOP 1 1 FROM @ForecastResult)
    BEGIN
        RAISERROR ('No forecast results generated.', 18, 1);
        RETURN
    END

    SELECT * FROM @ForecastResult
END

您可以看到,我添加了一个检查以验证存储过程#1的结果不为空。

在存储过程2中,我呼叫#1:

CREATE PROCEDURE [dbo].[spExecuteForecast]
AS
BEGIN
    BEGIN TRY
        DECLARE @ForecastResult TABLE(
            [ProductId] INT NOT NULL,
            [Forecast30] DECIMAL(13,3) NOT NULL,
            [Forecast60] DECIMAL(13,3) NOT NULL,
            [Forecast90] DECIMAL(13,3) NOT NULL,
            [Forecast120] DECIMAL(13,3) NOT NULL
        )

        INSERT INTO @ForecastResult
            EXEC [RemoteServer].[RemoteDB].[dbo].[spCalculateForecast]

        IF NOT EXISTS (SELECT TOP 1 1 FROM @ForecastResult)
        BEGIN
            RAISERROR ('Forecast result empty', 18, 1)
        END

        -- DO SOMETHING WITH THE RESULT
    BEGIN CATCH
        -- log error
    END CATCH
END

在存储过程#2中,我还添加了一个检查以验证存储过程#1的结果不为空。

如前所述,两个存储过程均按预期工作,除非发生错误。然后是存储过程2中每次都会出现“预测结果为空”错误。

对我来说,存储过程#1看起来创建了一个有效的结果,但是存储过程#2无法获取它。我以为可能是连接问题,但是我会期望收到一条错误消息,指出这一点,或者如果它在创建预测结果时出现问题,我就会收到一条错误消息,指出这一点,或者至少是存储过程#1的验证错误。] >

有人知道这里发生了什么吗?

提前感谢。

调用远程存储过程时,我有一个奇怪的行为:通常它可以按预期工作,但是有时我无法从存储过程中得到结果。详细信息:我有两个存储过程。...

sql-server tsql rpc sql-server-2017
1个回答
1
投票

经过长时间的搜索并尝试了我能想到的所有方法之后,我使用SQL Server Profiler运行了监视(如@Amirhossein所建议的那样,非常感谢。)监控显示一个错误,这向我指出了错误的方向。但是监视还包含RPC调用的开始和结束时间,恰好是20分钟。对我来说,唯一可能的答案是:超时。我有一个新的搜索方向,找到了这个答案:https://stackoverflow.com/a/54531530/12997628

© www.soinside.com 2019 - 2024. All rights reserved.