ALTER PROCEDURE dbo.CurePeriod
@curDate_p1 datetime
-- call
exec CurePeriod @curDateTrick
Могу ли я позвонить себе в хранимой процедуре? Справа? Большое спасибо.Вызвать хранимую процедуру сам sql
ALTER PROCEDURE dbo.CurePeriod
@curDate_p1 datetime
-- call
exec CurePeriod @curDateTrick
Могу ли я позвонить себе в хранимой процедуре? Справа? Большое спасибо.Вызвать хранимую процедуру сам sql
Рекурсия поддерживается во многих СУБД и, в принципе, ее реализация очень похожа на то, что вы написали.
В вашем примере, условие выход требуется, чтобы избежать бесконечной глубины рекурсии, так что вы должны иметь что-то вроде следующего:
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 выписок.
Будьте предельно осторожны при вызове хранимой процедуры внутри себя, бесконечные итерации могут вызвать некоторые серьезные проблемы в зависимости от того, что еще делается в proc.
Если вы используете условия в proc, чтобы убедиться, что это выполняется только сколько раз, вы можете обойти это.
BEGIN
IF @TEST = 'VALUE'
EXEC PROCNAME @PROCPARAM
ELSE
'SOMETHING ELSE'
END IF ;
Вы можете сделать это, но вам придется как-то управлять, как вы сломаете из исполнения (если вообще возможно).
При создании хранимой процедуры, выполнить указанную процедуру внутри себя, а затем выполнить его, он будет просто выполнить infinately пока вы встретились с сообщением об ошибке в
Maximum stored procedure, function, trigger, or view nesting level exceeded
.
В 99% случаев будет лучший способ. Скорее опубликуйте вопрос о том, чего вы пытаетесь достичь, и продемонстрируете, что вы пробовали, и предложили людям лучшие способы получить желаемый результат.
Вы должны называть это условно иначе он будет называть его себя для бесконечности – Developerzzz
Какая БД вы используете? Чего вы хотите достичь? BTW это действительный вызов, но он будет проходить в бесконечном цикле. – Ubercool
В SQL Server вы можете написать рекурсивную хранимую процедуру. Просто имейте в виду, что максимальный уровень вложенности равен 32. См. ['@@ NESTLEVEL'] (https://msdn.microsoft.com/en-us/library/ms187371.aspx) –