Подтвердить что ты не робот

T-SQL: как создать функцию "Private" внутри хранимой процедуры

Хорошо, поэтому я пишу хранимую процедуру SQL Server 2008 (техническое обслуживание script).

При этом, будучи хорошим мальчиком, я сделал много обработки ошибок, проверил количество строк, распечатывал выходные сообщения и т.д.

Но, делая это, я обнаружил, что снова и снова пишу что-то вроде этого:

SELECT @RowsAffected = @@ROWCOUNT
IF @RowsAffected > 0
BEGIN
   PRINT CAST(@RowsAffected, NVARCHAR(2)) + 'rows updated.'
END

Или отлаживать такие сообщения:

PRINT 'User ' + CAST(@UserId AS NVARCHAR(5)) + ' modified successfully'

Есть ли способ создать своего рода "подпрограмму" внутри хранимой процедуры (например, частный метод), который может принимать что-то в качестве параметра (не обязательно) и делать некоторую логику?

Я хочу сделать что-то вроде этого:

CheckRowCounts

Или это:

PrintUserUpatedMessage(@UserId)

который затем выполнил бы вышеуказанную логику (проверьте количество строк, сообщение печати и т.д.)

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

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

Может ли кто-нибудь помочь?

ИЗМЕНИТЬ

Итак, я закончил создание скалярной функции UDF (кажется только способом).

Тем не менее, я получил правильный ответ Fredrik, хотя я не планирую его реализовывать, это как правильный ответ, так и творческий.

Спасибо за все советы/помощь.

4b9b3361

Ответ 1

Сначала я попытался создать еще один временный SP из существующего SP - который не сработал, но после нескольких экспериментов я думаю, что вы можете пойти с чем-то вроде этого (если вы не против динамического SQL):

CREATE PROCEDURE sp_myTest_v1_0(@firstName NVARCHAR(255)) AS
BEGIN
    -- declare private method
    DECLARE @privateMethod NVARCHAR(255), @privateMethodSig NVARCHAR(255)
    SELECT @privateMethod = 
        'DECLARE @x INT' + CHAR(10) +
        'WHILE ISNULL(@x,0) < 10 BEGIN' + CHAR(10) +
            'PRINT @param1 + CAST(@x AS VARCHAR)' + CHAR(10) +
            'SET @x = ISNULL(@x,0)+1' + CHAR(10) +
        'END', @privateMethodSig = '@param1 NVARCHAR(255)'

    -- call privateMethod
    EXEC sp_executesql @privateMethod, @privateMethodSig, @param1 = @firstName
END
GO

Ответ 2

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