T- SQL: результат удаленной хранимой процедуры иногда пуст - PullRequest
0 голосов
/ 03 марта 2020

У меня странное поведение при вызове удаленной хранимой процедуры: обычно она работает как положено, но иногда я не получаю результат от хранимой процедуры.

Подробно: у меня есть две хранимые процедуры. Первый вызывает второй, запускаемый третьим, который запускается SQL агентом сервера, но я сосредоточусь на # 1 и # 2.

Здесь хранится хранимая процедура # 1 (a немного уменьшен):

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 I вызов # 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.

Кто-нибудь знает, что здесь происходит?

Заранее спасибо.

1 Ответ

1 голос
/ 23 апреля 2020

После долгого поиска и пробования всего, о чем я мог подумать, я запустил мониторинг с помощью SQL Server Profiler (как советовал @Amirhossein, спасибо за это). Мониторинг показывает ошибку, которая указала мне в неверном направлении. Но мониторинг содержал также время начала и окончания вызова RP C, которое составило ровно 20 минут. Единственный возможный ответ для меня был: Тайм-аут. У меня было новое направление поиска, и я нашел этот ответ: { ссылка }

Короткое утверждение SQL показывает, что RP C Timeout установлен на 20 минут.

SELECT * FROM sys.configurations WHERE name = 'remote query timeout (s)'

Итак, вкратце: я не получил ни данных, ни ошибок, потому что TRY CATCH не перехватывает тайм-ауты

Я увеличил тайм-аут, и теперь все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...