繁体   English   中英

T-SQL动态执行存储过程

[英]T-SQL Dynamically execute stored procedure

我在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!'

我会把别名放在每个程序的顶部。

你怎么看?

非常简单

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';

OBJECT_SCHEMA_NAME上的 MSDN和@@ PROCID

编辑:

请注意在事务期间登录表。 在回滚时,您将丢失日志数据

比它的价值更麻烦,但它会

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

所以没有太多用处。

就个人而言,我只是重命名SP,或者推动使用简洁命名的功能。 如果你必须管理风格设施恕我直言,建立字符串并执行它们是唯一的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM