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

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

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

Но в выполнении этого, я писал много раз что-то вроде этого:

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, но затем я должен был бы создать/отбросить его и т.д., поскольку эта логика только требуется для жизни выполнения этой хранимой процедуры.

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

Кто-либо может помочь?

Править

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

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

Спасибо за весь совет/справку.

20
задан PGSystemTester 23 June 2018 в 16:12
поделиться

2 ответа

Сначала я попытался создать другую временную служебную программу из существующей служебной программы, но это не сработало, но после небольшого эксперимента я думаю, что вы могли бы использовать что-то вроде этого (если вы не против динамического 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
20
ответ дан 30 November 2019 в 01:10
поделиться

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

0
ответ дан 30 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: