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

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

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

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

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)

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

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

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

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

редактировать

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

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

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

2 ответов


Я сначала попытался создать другой, временный 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

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