好的,我正在编写一个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,但是我需要创建/删除它等,因为这个逻辑只需要执行这个存储过程的生命周期。
厌倦了一遍又一遍地编写相同的代码,并且在我收到错误时更改了我使用过的所有不同区域=)
有人可以帮忙吗?
修改
好的,所以我最终创建了一个标量UDF函数(似乎只是这样)。
然而,我已经给Fredrik一个正确的答案,虽然我不打算实施这个,但它既是正确的答案,也是一个创造性的答案。
感谢所有建议/帮助。
答案 0 :(得分:19)
我首先尝试在现有的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
答案 1 :(得分:0)
在tsql中并不是那样的。正如你所说,最接近的是标量udf,你似乎并不喜欢这个想法。我没有看到创建这样的辅助函数并将它们留在数据库中的问题。当然,你有其他程序可以从好消息中受益。