2008-09-29 1 views
16

누가 저장 프로 시저를 호출했는지 확인할 수 있습니까?SQL Server에서 호출 저장 프로 시저 찾아보기

예를 들어 proc3에 오류가 발생한다고 가정 해 보겠습니다. 해당 proc 내에서 proc1 또는 proc2에 의해 호출되었는지 알고 싶습니다.

+6

'OBJECT_NAME (@@ PROCID)'를 가져 와서 현재 SP의 이름을 알 수 있습니다. – Gman

답변

8

논리가 중요 할 경우 추가 입력 매개 변수를 사용하여 소스를 지정합니다.

이렇게하면 일부 플랫폼에 종속 된 기능에 의존하지 않으므로 데이터베이스를 다른 플랫폼으로 쉽게 이식 할 수 있습니다.

3

런타임시 오류가 발생하는 proc3을 알아야합니까, 아니면 디버깅하는 동안 알아야합니까?

디버그/모니터링 중에 만 수행해야하는 경우 SQL Server profiler을 사용할 수 있습니다.

그렇지 않으면 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 Books Online

SQL 서버 2008는 그러나 절차를 디버깅 할 수있는 능력을 가지고있다.

2

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 
3

없습니다. 그래서 당신이 procs를 작성할 수 있도록하기 위해 얼마나 많은 양의 준비가되어 있는지에 달려 있습니다.

로깅 메커니즘이있는 경우 로그를 읽고 전화를 걸어 볼 수 있습니다. 예를 들어

, 당신은 예를 들어, 테이블에 삽입하여 로깅을 구현하는 경우 :

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) 

이 재귀 호출을 위해 작동하지 않을 것입니다, 그러나 아마 누군가가 그것을 해결할 수 있습니까?