2008-09-29 8 views

Odpowiedz

8

Chciałbym użyć dodatkowego parametru wejściowego, aby określić źródło, jeśli jest to ważne dla twojej logiki.

Ułatwi to również przeniesienie bazy danych na inną platformę, ponieważ nie zależy to od funkcji zależnej od niejasnej platformy.

3

Czy musisz wiedzieć w proc3 w czasie wykonywania, który spowodował błąd, czy po prostu musisz wiedzieć podczas debugowania?

Możesz użyć SQL Server profiler, jeśli potrzebujesz tego tylko podczas debugowania/monitorowania.

W przeciwnym razie w 2005 r. Nie wierzę, że masz możliwość śledzenia stosu.

Do obejścia tego można dodać i dodać dodatkowy parametr do proc3, @CallingProc lub coś w tym stylu.

ALBO możesz dodać try catch blocks do proc1 i proc2.

BEGIN TRY 
EXEC Proc3 
END TRY 
BEGIN CATCH 
SELECT 'Error Caught' 
SELECT 
    ERROR_PROCEDURE() 
END CATCH 

dobre referencje tutaj: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html

i oczywiście zawsze SQL Server Books Online

SQL Server 2008 ma możliwość debugowania poprzez procedury jednak.

2

Możesz mieć proc1 i proc2 przekazać swoje nazwy do proc3 jako parametr.

Na przykład:

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

Nie ma ładny automatyczny sposób to zrobić (niestety). To naprawdę zależy od tego, ile jesteś przygotowany (ponownie) napisać swoje proci, aby móc to zrobić.

Jeśli masz mechanizm rejestrowania, możesz przeczytać dziennik i ustalić, kto do Ciebie zadzwonił.

Na przykład, jeśli wdrożenie rejestrowanie poprzez wstawienie do tabeli, na przykład:

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) 

To nie będzie działać dla wywołań rekurencyjnych, ale być może ktoś może naprawić?

Powiązane problemy