2008-09-29 25 views

Respuesta

8

Utilizaría un parámetro de entrada adicional, para especificar la fuente, si esto es importante para su lógica.

Esto también hará que sea más fácil transportar su base de datos a otra plataforma, ya que no depende de alguna función oscura dependiente de la plataforma.

3

¿Necesita saber en proc3 durante el tiempo de ejecución cuál fue el error o simplemente debe saberlo durante la depuración?

Puede usar SQL Server profiler si solo necesita hacerlo durante la depuración/supervisión.

De lo contrario, en 2005 no creo que tenga la capacidad de acumular trazas.

Para solucionarlo, puede agregar un parámetro extra a proc3, @CallingProc o algo así.

O podría agregar try catch blocks a proc1 y proc2.

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

buena referencia aquí: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html

y por supuesto siempre SQL Server Books Online

SQL Server 2008 tiene la capacidad para depurar a través de procedimientos de embargo.

2

Puede hacer que proc1 y proc2 pasen sus nombres a proc3 como parámetro.

Por ejemplo:

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

No hay manera automática agradable de hacer esto (por desgracia). Por lo tanto, realmente depende de cuánto esté preparado para (re) escribir sus procesos para poder hacer esto.

Si tiene un mecanismo de registro, es posible que pueda leer el registro y averiguar quién lo llamó.

Por ejemplo, si se implementa el registro mediante la inserción de una mesa, por ejemplo:

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) 

Esto no funcionaría para las llamadas recursivas, pero tal vez alguien puede arreglar eso?

Cuestiones relacionadas