T-SQL Динамически выполнять хранимую процедуру - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть функция регистрации в 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!'

И я бы поставил этот псевдоним наверху каждой процедуры.

Что вы думаете?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Довольно просто

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

Edit:

Остерегайтесь входа в таблицы во время транзакций. При откате вы потеряете данные журнала

0 голосов
/ 08 декабря 2011

Больше проблем, чем оно того стоит, но это будет

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

Так что не так уж много пользы.

Лично я бы просто переименовал SP, или на толчок использовалкратко названная функция.Построение строк и их выполнение - единственное, если вам нужно средство в стиле администратора IMHO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...