2011-12-07 165 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他们是唯一的,如果你必须管理风格的设施恕我直言