2010-06-08 76 views
13

好,即時編寫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,因爲雖然我不打算實施這個,但它既是正確答案也是創造性答案。

感謝您的所有建議/幫助。

回答

15

我第一次嘗試從現有的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

0

在tsql中並非如此。正如你所說,最接近的是一個標量udf,你似乎並不是這個想法的忠實粉絲。我沒有看到創建一些像這樣的幫助函數並將它們留在數據庫中的問題。當然你還有其他的程序可以從好的信息中受益。

+0

我同意沒有幫助功能(我有很多,如splitstring,propercase等)的傷害。但是像這樣的事情(在事務中打印出信息,行數等)似乎有點矯枉過正。然而,正如我所說的那樣,我認爲身份證是否有任何其他想法。 – RPM1984 2010-06-08 05:35:08