У меня странное поведение при вызове удаленной хранимой процедуры: обычно она работает как положено, но иногда я не получаю результат от хранимой процедуры.
Подробно: у меня есть две хранимые процедуры. Первый вызывает второй, запускаемый третьим, который запускается 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.
Кто-нибудь знает, что здесь происходит?
Заранее спасибо.