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