2016-11-29 6 views
1
ALTER PROCEDURE dbo.CurePeriod 
@curDate_p1 datetime 

-- call 
exec CurePeriod @curDateTrick 

Могу ли я позвонить себе в хранимой процедуре? Справа? Большое спасибо.Вызвать хранимую процедуру сам sql

+1

Вы должны называть это условно иначе он будет называть его себя для бесконечности – Developerzzz

+1

Какая БД вы используете? Чего вы хотите достичь? BTW это действительный вызов, но он будет проходить в бесконечном цикле. – Ubercool

+0

В SQL Server вы можете написать рекурсивную хранимую процедуру. Просто имейте в виду, что максимальный уровень вложенности равен 32. См. ['@@ NESTLEVEL'] (https://msdn.microsoft.com/en-us/library/ms187371.aspx) –

ответ

0

Рекурсия поддерживается во многих СУБД и, в принципе, ее реализация очень похожа на то, что вы написали.

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

CREATE PROCEDURE dbo.CurePeriod (@curDate_p1 datetime , @OtherParam INT) 
AS 

    BEGIN 
     IF @OtherParam < 10 THEN 
      exec CurePeriod (@curDateTrick , @OtherParam + 1) ; 
     END IF ; 
    END ; 

и где-то в вашем коде:

: 
: 
exec CurePeriod (@curDateTrick , 1) ; 
: 
: 

Примечания:

(1) Ваш пример представляется для SQL-Server и, следовательно, вам может потребоваться некоторое редактирование для Например, я публикую здесь.

(2) Я заставляю рекурсию закончиться после 10 выписок.

1

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

Если вы используете условия в proc, чтобы убедиться, что это выполняется только сколько раз, вы можете обойти это.

BEGIN 
IF @TEST = 'VALUE' 
    EXEC PROCNAME @PROCPARAM 
ELSE 
    'SOMETHING ELSE' 
END IF ; 
1

Вы можете сделать это, но вам придется как-то управлять, как вы сломаете из исполнения (если вообще возможно).

При создании хранимой процедуры, выполнить указанную процедуру внутри себя, а затем выполнить его, он будет просто выполнить infinately пока вы встретились с сообщением об ошибке в

Maximum stored procedure, function, trigger, or view nesting level exceeded 

.

В 99% случаев будет лучший способ. Скорее опубликуйте вопрос о том, чего вы пытаетесь достичь, и продемонстрируете, что вы пробовали, и предложили людям лучшие способы получить желаемый результат.

Смежные вопросы