2010-08-18 2 views
3

Je souhaite ajouter un enregistrement à un proc stocké particulier qui est appelé par environ 5000 process stockés dans 20 bases de données.Comment identifier le proc mémorisé appelant

Ce que je voudrais ajouter est d'en haut de l'appelé proc stocké quelque chose comme:

insert en valeurs CallLog (@@ appelant, getdate())

Ainsi, après un moment, je peut obtenir une belle liste de tous les procs stockés qui appellent celui-ci.

Quelqu'un peut-il m'aider avec la partie appelant @@?

Répondre

0

Essayez

SELECT @caller = OBJECT_NAME(@@PROCID) 

EDIT: Une fois que vous avez obtenu proc en cours. nom, passez-le à log sp en paramètre, c'est tout.

Cela ne fonctionne que dans la procédure stockée.

Un exemple sur l'utilisation de cette

USE AdventureWorks; 
GO 
IF OBJECT_ID ('usp_FindName', 'P') IS NOT NULL 
DROP PROCEDURE usp_FindName; 
GO 
CREATE PROCEDURE usp_FindName 
    @lastname varchar(40) = '%', 
    @firstname varchar(20) = '%' 
AS 
DECLARE @Count int; 
DECLARE @ProcName nvarchar(128); 
SELECT LastName, FirstName, Phone, EmailAddress 
FROM Person.Contact 
WHERE FirstName LIKE @firstname AND LastName LIKE @lastname; 
SET @Count = @@ROWCOUNT; 
SET @ProcName = OBJECT_NAME(@@PROCID); 
RAISERROR ('Stored procedure %s returned %d rows.', 16,10, @ProcName, @Count); 
GO 
EXECUTE dbo.usp_FindName 'P%', 'A%'; 

Plus sur cette

http://msdn.microsoft.com/en-us/library/ms174408(SQL.90).aspx

Un exemple sur l'enregistrement de procédure stockée. Peut être utile

http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx

est ici une question connexe aussi

Can a MS/Transact-SQL stored procedure look up its own name?

EDIT 2: et d'autres questions connexes dans SO

Find out the calling stored procedure in SQL Server

+0

hmmm, je pense que c'est proche mais à moins que je manque quelque chose, pas de cigare. SELECT @caller = OBJECT_NAME (@@ PROCID) Renvoie le nom du proc stocké courant, je recherche le proc stocké qui l'a appelé. Alors créer un proc comme exec b go créer proc b comme sélectionnez l'appelant @@ aller EXEC a> retourne 'b' – Steven

+0

Steven, je l'ai modifié ma réponse . Comme je l'ai écrit, après avoir eu proc actuel. nom, passez-le à log sp en paramètre, c'est tout. Voici un exemple de procédure stockée de journalisation. http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx – hgulyan

+0

Merci encore. J'essayais de suivre les appels à un sp particulier ne sachant pas qui les appelants pourraient être, mais cela semble impossible à faire :( – Steven

0

Vous pourriez potentiellement identifier l'orig En utilisant DBCC INPUTBUFFER, mais je ne pense pas qu'il y ait quelque chose qui vous permet de trouver l'appelant immédiat d'un proc.

(rapidement concoctés par exemple - peuvent être différents problèmes d'autorisations ici, peut vouloir déplacer la partie d'enregistrement dans un autre proc stocké avec différents EXECUTE AS paramètres):

create table CallLog (
    EventType varchar(50) not null, 
    Parameters int not null, 
    EventInfo varchar(max) not null 
) 
go 
create procedure Callee 
as 
    declare @Logger varchar(1000) 
    set @Logger = 'dbcc inputbuffer(' + CONVERT(varchar(10),@@SPID) + ')' 
    insert into CallLog(EventType,Parameters,EventInfo) 
    exec(@Logger) 

    --Now do the actual work for the stored proc 
    select * from sysobjects 
go 
create procedure Caller 
as 
    exec Callee 
go 
exec Caller 
go 
select * from CallLog 
0

Malheureusement, il n'y a aucun moyen de accéder à la pile d'appels SP à partir de T-SQL. Si vous en avez besoin temporairement à des fins de débogage, vous pouvez utiliser SQL Profiler. Décrit une solution de contournement - fondamentalement, la mise en œuvre de votre propre pile d'appels en utilisant SET CONTEXT_INFO.
Si vous en avez besoin pour une seule procédure, il semble plus pratique d'ajouter un paramètre supplémentaire.

Questions connexes