T-SQL:如何在存储过程中创建“私有”功能

问题描述:

好,即时编写SQL Server 2008存储过程(维护脚本)。T-SQL:如何在存储过程中创建“私有”功能

这样做,是一个很好的男孩,我已经做了很多的错误处理,检查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) 

然后将执行上述逻辑(检查行数,打印信息等)

是的,很明显,我可以创建一个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 
+1

+1开箱即用! =) – RPM1984 2010-06-08 06:22:50

+1

这实际上并不可怕。 +1 – 2010-06-08 06:23:30

在tsql中并非如此。正如你所说,最接近的是一个标量udf,你似乎并不是这个想法的忠实粉丝。我没有看到创建一些像这样的帮助函数并将它们留在数据库中的问题。当然你还有其他的程序可以从好的信息中受益。

+0

我同意没有帮助功能(我有很多,如splitstring,propercase等)的伤害。但是像这样的事情(在事务中打印出信息,行数等)似乎有点矫枉过正。然而,正如我所说的那样,我认为身份证是否有任何其他想法。 – RPM1984 2010-06-08 05:35:08