好的,我写了一个sql Server 2008存储过程(维护脚本).
在这样做的时候,做个好孩子我做了大量的错误处理,检查行数,打印输出信息等
但是,在这样做的时候,ive发现自己一遍又一遍地写了这样的事情:
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提供了正确的答案,尽管我不打算实施这一点,但这是一个正确的答案和创造性的答案.
感谢所有的建议/帮助.
解决方法
我首先尝试从现有的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