Является ли наличие хранимой процедуры, которая вызывает другие хранимые процедуры, плохо? - PullRequest
4 голосов
/ 01 августа 2009

Я пытаюсь сделать длинную хранимую процедуру немного более управляемой. Неправильно ли иметь хранимые процедуры, которые вызывают другие хранимые процедуры, например, я хочу иметь sproc, который вставляет данные в таблицу и в зависимости от типа вставить дополнительную информацию в таблицу для этого типа, что-то вроде:

BEGIN TRANSACTION

        INSERT INTO dbo.ITSUsage (
            Customer_ID,
            [Type],
            Source
        ) VALUES ( 
            @Customer_ID,
            @Type,
            @Source
            )
    SET @ID = SCOPE_IDENTITY()  

    IF @Type = 1
        BEGIN
                  exec usp_Type1_INS @ID, @UsageInfo 
            END
        IF @TYPE = 2
                BEGIN
                  exec usp_Type2_INS @ID, @UsageInfo 
            END

    IF (@@ERROR <> 0)
        ROLLBACK TRANSACTION
    ELSE
        COMMIT TRANSACTION      

Или это то, что я должен обрабатывать в своем приложении?

Ответы [ 13 ]

12 голосов
/ 01 августа 2009

Мы постоянно вызываем из других процедур. В противном случае трудно / невозможно сегментировать приложение, интенсивно использующее базу данных (или только базу данных).

9 голосов
/ 01 августа 2009

Вызов процедуры изнутри другой процедуры вполне приемлем.

Однако в Transact-SQL использование @@ ERROR склонно к сбою. Например, ваш код. Он не сможет обнаружить ошибку вставки, а также любую ошибку, вызванную вызванными процедурами. Это связано с тем, что @@ ERROR сбрасывается при каждом выполнении оператора и сохраняет только результат самого последнего оператора. У меня есть запись в блоге, которая показывает правильный шаблон обработки ошибок в Transact-SQL и вложенности транзакций. Также у Эрланда Соммарского есть статья, в которой долгое время читается справочник по обработке ошибок в Transact-SQL .

.
4 голосов
/ 01 августа 2009

Определенно, нет.

Я видел огромные хранимые процедуры, делающие 20 разных вещей, которые действительно выиграли бы от реорганизации в более мелкие одноцелевые.

4 голосов
/ 01 августа 2009

Нет, это вполне приемлемо.

3 голосов
/ 01 августа 2009

Одна хранимая процедура вызывает другую хранимую процедуру. Просто есть предел на уровне вложенности, до которого вы можете идти.

В SQL Server текущий уровень вложенности возвращается функцией @@NESTLEVEL.

Пожалуйста, проверьте секцию Вложенная процедура здесь http://msdn.microsoft.com/en-us/library/aa258259(SQL.80).aspx

ура

3 голосов
/ 01 августа 2009

совсем нет, я бы даже сказал, рекомендуется по тем же причинам, по которым вы создаете методы в своем коде

3 голосов
/ 01 августа 2009

Пока это в одной и той же схеме БД, на мой взгляд, это вполне приемлемо.Это повторное использование, которое всегда выгодно для дублирования.Это похоже на вызов методов в некотором прикладном уровне.

2 голосов
/ 01 августа 2009

Как уже отмечали другие, это вполне приемлемо и необходимо, чтобы избежать дублирования функций.

Однако в Transact-SQL следите за транзакциями во вложенных вызовах хранимых процедур: вам нужно проверить @@TRANCOUNT перед выдачей rollback transaction, поскольку он откатывает все вложенные транзакции. Проверьте это статья для подробного объяснения.

2 голосов
/ 01 августа 2009

Нет. Это способствует повторному использованию и позволяет компоненту быть разбитым на части.

1 голос
/ 03 августа 2009

Да, это плохо. В то время как SQL Server поддерживает и позволяет одной хранимой процедуре вызывать другую хранимую процедуру. Я бы вообще старался избегать этого дизайна, если это возможно. Моя причина?

принцип единоличной ответственности

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