2011-12-07 162 views
0

我在T-SQL記錄功能類同此:T-SQL動態執行存儲過程

CREATE PROCEDURE [logging]  
@PROCEDURE VARCHAR(50), 
@MESSAGE VARCHAR(MAX) 
AS 
BEGIN 
    PRINT @MESSAGE 

END; 
GO 

我能這樣稱呼它:

execute logging N'procedure_i_am_in', N'log_message'; 

由於我的存儲過程名字有點冗長,我想寫一個別名或內聯函數等等,以當前的過程爲我調用日誌記錄程序。像這樣的東西(這是打破):

declare @_log varchar(max) 
set @_log = 'execute logging N''procedure_i_am_in'', ' 
execute @_log N'MESSAGE!' 

而且我會把這個別名在每個過程的頂部。

你有什麼想法?

+0

對您的問題不清楚。你需要關於你的代碼的幫助嗎(你似乎表示已經破壞了),還是你想對你的日誌記錄方法提出意見? –

+0

@Russel McClure問題是幫助代碼,但我接受任何批評 – Chris

+0

@Chris:你的想法很好,我使用它,但你可以有一個泛型來解決「procedure_i_am_in」根據我的答案 – gbn

回答

2

很簡單

CREATE PROCEDURE [logging]  
    @PROCID int,, 
    @MESSAGE VARCHAR(MAX) 
-- allows resolution of @PROCID in some circumstances 
-- eg nested calls, no direct permission on inner proc 
WITH EXECUTE AS OWNER 
AS 
BEGIN 
    -- you are using schemas, right? 
    PRINT OBJECT_SCHEMA_NAME(@PROCID) + '.' + OBJECT_NAME(@PROCID); 
    PRINT @MESSAGE 
END; 
GO 

然後

execute logging @@PROCID, N'log_message'; 

MSDN上OBJECT_SCHEMA_NAME@@PROCID

編輯:

小心登錄表du振鈴交易。在回滾時,您將丟失日誌數據

0

更多的麻煩比它的價值,但 這將是

Set @_log = 'exec ....N' + 'MESSAGE!' 
Exec (@log) 

所以沒有大量的使用。

就我個人而言,我只是重命名SP,或者在推送時使用簡潔的命名函數。大廈字符串和exec'ing他們是唯一的,如果你必須管理風格的設施恕我直言