Có thể lấy tên của Thủ tục được lưu trữ hiện tại trong MS SQL Server không?
Có thể có một biến hệ thống hoặc chức năng như thế GETDATE()
nào?
Có thể lấy tên của Thủ tục được lưu trữ hiện tại trong MS SQL Server không?
Có thể có một biến hệ thống hoặc chức năng như thế GETDATE()
nào?
Câu trả lời:
Bạn có thể thử điều này:
SELECT OBJECT_NAME(@@PROCID)
Cập nhật: Lệnh này vẫn có hiệu lực trên SQL Server 2016.
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
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
Bạn có thể sử dụng OBJECT_NAME (@@ PROCID)
Trả về mã định danh đối tượng (ID) của mô-đun Transact-SQL hiện tại. Mô-đun Transact-SQL có thể là một thủ tục được lưu trữ, chức năng do người dùng xác định hoặc trình kích hoạt.
Trong trường hợp cụ thể mà bạn quan tâm đến tên của thủ tục được lưu trữ tạm thời hiện đang thực thi , bạn có thể lấy nó qua:
select name
from tempdb.sys.procedures
where object_id = @@procid
Bạn không thể sử dụng câu trả lời được chấp nhận trong SQL Server để tìm tên của thủ tục được lưu trữ tạm thời hiện đang thực thi:
create procedure #p
as
select object_name(@@PROCID) as name
go
exec #p
name
--------------------------------------------------------------------------------------------------------------------------------
NULL
(1 row affected)
Bạn có thể kiểm tra NULL
trước khi nhận được lược đồ và tên của thủ tục được lưu trữ.
Điều này có nghĩa là bạn có thể nhận được dữ liệu phù hợp ngay cả cho các thủ tục được lưu trữ tạm thời (toàn cầu) (nhấp vào hình ảnh để phóng to hơn):
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;