Проблема из-за использования RETURN в хранимой процедуре - PullRequest
0 голосов
/ 29 июня 2011

Я написал хранимую процедуру. В нем я хочу проверить условие, и если это условие становится истинным, я не хочу переходить к оставшейся части хранимой процедуры.

Если возвращается false, я хочу продолжить оставшуюся часть хранимой процедуры.

Моя хранимая процедура здесь:

    IF (@RefPOID <> 0)
    BEGIN
    IF EXISTS(// SELECT STATEMENT)
    BEGIN
    SET @Status = 'Please select the Items'                 
        RETURN
    END 
END 
    IF(POID = 0)
    BEGIN

           //INSERTION

    END
    ELSE
    BEGIN

           //DELETION

    END

Эта хранимая процедура успешно скомпилирована. Но при вызове этой хранимой процедуры из внешнего интерфейса отображается ошибка

System.Data.SqlClient.SqlException: A произошла серьезная ошибка команда. Результаты, если таковые имеются, должны быть отброшенным.

Если я удалил инструкцию RETURN из хранимой процедуры, то она работает нормально.

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

Но я хочу проверить там условие и вернуться, если оно истинно.

Уверен, проблема возникнет из-за наличия ВОЗВРАТА.

Почему проблема возникает? Что пошло не так? Как это решить? Любое предложение, пожалуйста.

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Если вы хотите, чтобы статус указывал на сбой, у меня возникнет соблазн либо выполнить проверку достоверности перед вызовом этого сохраненного процесса, либо использовать RAISERROR в блоке TRY CATCH.

BEGIN TRY

IF (@RefPOID <> 0)
BEGIN
      IF EXISTS(SELECT 1 FROM @Item I WHERE NOT EXISTS(SELECT P.ItemID FROM PUR_POIndent P WHERE P.ItemID = I.ItemID AND P.D1 = I.D1 AND P.D2 = I.D2 AND P.D3 = I.D3 AND P.POID = @RefPOID))
          BEGIN
          RAISERROR('Please select Items only related to the Reference Purchase', 16, 1)
          RETURN
      END  
END

...
END TRY
BEGIN CATCH

DECLARE @ErrorMessage NVARCHAR(MAX);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;

            SELECT @ErrorMessage = ERROR_MESSAGE(),
                   @ErrorSeverity = ERROR_SEVERITY(),
                   @ErrorState = ERROR_STATE();

            RAISERROR (@ErrorMessage, -- Message text.
                       @ErrorSeverity, -- Severity.
                       @ErrorState -- State.
                        );
END CATCH
1 голос
/ 29 июня 2011

Я не думаю, что ваше возвращение является проблемой. Запрос может быть недействительным. Но вы сказали, что это работает, если вы удалите возврат. Это странно.

Не могли бы вы опубликовать полный код?

Вы пытались запустить в анализаторе запросов или менеджере студии?

У вас есть:

SELECT 1 FROM @Item

Это действительно? Что такое @Item - табличная переменная?

...