Можно ли узнать, кто вызвал процедуру магазина?
Например, скажем, я получаю ошибку в proc3. Изнутри этого процесса я хочу знать, был ли он вызван proc1 или proc2.


Я бы использовал дополнительный входной параметр, чтобы указать источник, если это важно для вашей логики.
Это также упростит перенос вашей базы данных на другую платформу, поскольку вы не зависите от какой-то неясной функции, зависящей от платформы.
Вам нужно знать в proc3 во время выполнения, что вызвало ошибку, или вам просто нужно знать во время отладки?
Вы можете использовать Профилировщик SQL Server, если вам нужно сделать это только во время отладки / мониторинга.
В противном случае в 2005 году я не верю, что у вас есть возможность складывать трассировку.
Чтобы обойти это, вы можете добавить дополнительный параметр в proc3, @CallingProc или что-то в этом роде.
ИЛИ вы можете добавить блоки try catch в proc1 и proc2.
BEGIN TRY
EXEC Proc3
END TRY
BEGIN CATCH
SELECT 'Error Caught'
SELECT
ERROR_PROCEDURE()
END CATCH
Хорошая ссылка здесь: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html
и конечно всегда Электронная документация по SQL Server
Однако в SQL Server 2008 есть возможность выполнять отладку с помощью процедур.
Вы можете сделать так, чтобы proc1 и proc2 передавали свои имена в proc3 в качестве параметра.
Например:
CREATE PROCEDURE proc3
@Caller nvarchar(128) -- Name of calling proc.
AS
BEGIN
-- Produce error message that includes caller's name.
RAISERROR ('Caller was %s.', 16,10, @Caller);
END
GO
CREATE PROCEDURE proc1
AS
BEGIN
-- Get the name of this proc.
DECLARE @ProcName nvarchar(128);
SET @ProcName = OBJECT_NAME(@@PROCID);
-- Pass it to proc3.
EXEC proc3 @ProcName
END
GO
CREATE PROCEDURE proc2
AS
BEGIN
-- Get the name of this proc.
DECLARE @ProcName nvarchar(128);
SET @ProcName = OBJECT_NAME(@@PROCID);
-- Pass it to proc3.
EXEC proc3 @ProcName
END
GO
Нет хорошего автоматического способа сделать это (увы). Так что это действительно зависит от того, насколько вы готовы (пере) писать свои процедуры, чтобы иметь возможность это сделать.
Если у вас есть механизм регистрации, вы можете прочитать журнал и выяснить, кто вам звонил.
Например, если вы реализуете ведение журнала путем вставки в таблицу, например:
CREATE TABLE Log
(timestamp dattime,
spid int,
procname varchar(255),
message varchar(255) )
... text of proc ...
INSERT INTO Log
SELECT get_date(), @@spid, @currentproc, 'doing something'
-- you have to define @currentproc in each proc
-- get name of caller
SELECT @caller = procname
FROM Log
WHERE spid = @@spid
AND timestamp = (SELECT max(timestamp)
FROM Log
WHERE timestamp < get_date()
AND procname != @currentproc )
Это не сработает для рекурсивных вызовов, но, может быть, кто-то сможет это исправить?
Вы можете узнать имя текущего SP, получив
OBJECT_NAME(@@PROCID)