2009-04-03 11 views
12

¿Hay alguna manera dentro de un procedimiento almacenado para que haga referencia a su propio nombre? Digamos que quiero que imprima su propio nombre, pero sin codificar el nombre en el procedimiento almacenado. ¿Hay alguna forma engañosa de obtener el nombre o la identificación dentro del procedimiento mismo sin usar el nombre real para encontrar la información?¿Puede un procedimiento almacenado de MS/Transact-SQL buscar su propio nombre?

Respuesta

33

Probar:

SELECT OBJECT_NAME(@@PROCID) 

@@ procid devuelve el ID de objeto del módulo de SQL actual. OBJECT_NAME traduce una ID de objeto a su nombre. Ambos están disponibles desde al menos la versión 7 a 2008 de SQL Server.

+0

D'oh! Segundos demasiado tarde. Touche! +1 –

+0

+1 Funciona en mi máquina: por cierto, ¿funciona @@ PROCID para todas las versiones de SQL Server? Quiero decir, al menos para SQL Server 2k/2k5/2k8? – Sung

+0

Sí, al menos 2000 en adelante. No puedo recordar si esto solía funcionar en 6.5 o 7. –

14

Usted está buscando @@ procid y OBJECT_NAME es decir

select @procName=OBJECT_NAME(@@PROCID) 
+0

No hay razón por la que no deba votar por su respuesta solo porque se perdió por segundos. – TheTXI

+0

Gents, estoy conmovido :) –

3

Nombre del proc/func

Select OBJECT_NAME(@@PROCID); 

otras cosas interesantes

Select * From sys.sysprocesses Where spid = @@SPID 
0

Aquí hay un código que escribí Tinker , corriendo contra una base de datos SQL Server 2005 para jugar con la función OBJECT_NAME (@@ PROCID).

Ejecutar esta sección en primer lugar, para crear una tabla de registro

CREATE TABLE Diagnostics_Log 
    (
    sprocName sysname, 
    WhenRun datetime, 
    Comment Varchar(160) NULL 
) 

- =========================== =============

A continuación, ejecute este T-SQL para crear algunas versiones del mismo sproc, agregando un sufijo numérico cada vez.

CREATE PROC dg_test_name_logging 
    @Comment Varchar(160) 
AS 
    declare @Sprocname sysname 
    select @sprocName = OBJECT_NAME(@@PROCID) 

    PRINT @@PROCID 
    print @sprocname 

    insert into Diagnostics_Log VALUES (@sprocname, GetDate(), @Comment) 

GO 

- ========== A continuación, ejecute esta sección

exec dg_test_name_logging 'this is the first run' 
WAITFOR DELAY '00:00:00:123' 
    exec dg_test_name_logging1 'this is my second comment' 
WAITFOR DELAY '00:00:00:123' 
    exec dg_test_name_logging2 'yet another comment' 
WAITFOR DELAY '00:00:02:123' 
    exec dg_test_name_logging3 'amazing' 
WAITFOR DELAY '00:00:00:123' 
    exec dg_test_name_logging4 'I''ll be gobsmacked if this works' 
WAITFOR DELAY '00:00:00:123' 
    exec dg_test_name_logging5 'It''s ALIVE !!!' 

    select * from Diagnostics_Log 

podría ser útil para el registro cuando sprocs o puntos de vista se ejecutan o se puede acceder.

0

object_name() por sí solo no especifica el esquema del objeto actual. Para hacer eso:

print object_schema_name(@@PROCID) + '.' + object_name(@@PROCID) 
Cuestiones relacionadas