Nama prosedur pelaksanaan saat ini

95

Apakah mungkin untuk mendapatkan nama Prosedur Tersimpan saat ini di MS SQL Server?

Mungkin ada variabel sistem atau fungsi seperti GETDATE()?

Sergey Metlov
sumber

Jawaban:

145

Anda dapat mencoba ini:

SELECT OBJECT_NAME(@@PROCID)

Pembaruan: Perintah ini masih berlaku di SQL Server 2016.

Alireza Maddah
sumber
4
Perlu dicatat bahwa nilai yang dikembalikan adalah tipe SYSNAME.
Buggieboy
apa yang harus dilakukan untuk fungsi bukan prosedur? ada ide? Tolong bantu
Vinay Sinha
1
Masih valid di SQL Serve 2012
Pimenta
2
Masih valid di SQL Server 2016
Fka
Tidak berfungsi untuk sesi atau prosedur penyimpanan sementara global.
ajeh
81
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
karthik
sumber
3
Jika Anda menggunakan ini di dalam Proc temp, ia mengembalikan NULL, dengan atau tanpa pengambilan nama skema. Proc pertama adalah "normal", kedua adalah temp, dalam kode ini: BEGIN TRAN GO CREATE PROC utility.TempProc AS SELECT OBJECT_SCHEMA_NAME(@@PROCID)+'.'+OBJECT_NAME(@@PROCID) GO EXEC utility.TempProc GO ROLLBACK GO BEGIN TRAN GO CREATE PROC utility.#TempProc AS SELECT OBJECT_SCHEMA_NAME(@@PROCID)+'.'+OBJECT_NAME(@@PROCID) GO EXEC utility.#TempProc GO ROLLBACK GO
SAinCA
15

Anda dapat menggunakan OBJECT_NAME (@@ PROCID)

Mengembalikan pengenal objek (ID) dari modul Transact-SQL saat ini. Modul Transact-SQL dapat berupa prosedur tersimpan, fungsi yang ditentukan pengguna, atau pemicu.

selai
sumber
6

Dalam kasus khusus di mana Anda tertarik dengan nama prosedur tersimpan sementara yang sedang dijalankan , Anda bisa mendapatkannya melalui:

select name
from tempdb.sys.procedures
where object_id = @@procid

Anda tidak dapat menggunakan jawaban yang diterima di SQL Server untuk menemukan nama prosedur tersimpan sementara yang sedang dijalankan:

create procedure #p
as
select object_name(@@PROCID) as name
go
exec #p


name
--------------------------------------------------------------------------------------------------------------------------------
NULL

(1 row affected)
ajeh
sumber
Dapat mengonfirmasi, diuji di Enterprise 2014 dalam mode kompatibilitas 2008R2 dengan cakupan sesi (double ##)
Elaskanator
1
Selain fakta, itu benar: Siapa yang akan membuat prosedur sementara ?? :-D
Tarek Salha
0

Anda bisa memeriksanya NULL sebelum mendapatkan skema dan nama prosedur tersimpan.

Ini berarti Anda bisa mendapatkan data yang benar bahkan untuk prosedur yang disimpan sementara (global) (klik gambar untuk memperbesar):

nama prosedur penyimpanan sementara non-sementara, sementara, dan global

USE [master]; --so we can test temp sprocs without cheating by being in tempdb.
GO

BEGIN TRAN;
GO

CREATE PROC dbo.NotTempProc
AS
BEGIN
    SELECT CASE
        WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
        THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
        ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
        END AS ProcName;
END
GO

EXEC dbo.NotTempProc;
GO

CREATE PROC dbo.#TempProc
AS
BEGIN
    SELECT CASE
        WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
        THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
        ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
        END AS ProcName;
END
GO

EXEC dbo.#TempProc;
GO

CREATE PROC dbo.##GlobalTempProc
AS
BEGIN
    SELECT CASE
        WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
        THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
        ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
        END AS ProcName;
END


GO

EXEC dbo.##GlobalTempProc;
GO

ROLLBACK;
Oreo
sumber