2009-04-03 25 views
12

Có cách nào trong một thủ tục được lưu trữ để nó tham chiếu đến tên riêng của nó không? Nói rằng tôi muốn nó để in tên riêng của nó, nhưng không mã hóa cứng tên trong thủ tục được lưu trữ. Có cách nào lừa đảo để có được tên hoặc id từ bên trong các thủ tục chính nó mà không sử dụng tên thực tế để tìm thông tin?Quy trình lưu trữ MS/Transact-SQL có thể tra cứu tên riêng của nó không?

Trả lời

33

Hãy thử:

SELECT OBJECT_NAME(@@PROCID) 

@@ PROCID trả về đối tượng ID của module SQL hiện hành. OBJECT_NAME dịch ID đối tượng thành tên của nó. Cả hai đều có sẵn từ ít nhất là phiên bản 7 đến 2008 của SQL Server.

+0

D'oh! Giây quá trễ. Touche! +1 –

+0

+1 Hoạt động trên máy của tôi: Nhân tiện, @@ PROCID có hoạt động với tất cả các phiên bản của SQL Server không? Tôi có nghĩa là, ít nhất là cho SQL Server 2k/2k5/2k8? – Sung

+0

Có, ít nhất 2000 trở lên. Không thể nhớ liệu điều này được sử dụng để làm việc trên 6,5 hoặc 7. –

14

Bạn đang tìm kiếm @@ PROCID và OBJECT_NAME tức

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

Không có lý do gì bạn cũng không nên bỏ phiếu cho câu trả lời của bạn chỉ vì bạn đã bỏ lỡ vài giây. – TheTXI

+0

Gents, tôi đang chạm vào :) –

3

Tên của proc/func

Select OBJECT_NAME(@@PROCID); 

khác những thứ thú vị

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

Dưới đây là một số mã tinker tôi đã viết , chạy với cơ sở dữ liệu SQL Server 2005 để chạy với hàm OBJECT_NAME (@@ PROCID).

Chạy phần này đầu tiên, để tạo ra một bảng log

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

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

Sau đó chạy T-SQL này để tạo một vài phiên bản của cùng một sproc, thêm một hậu tố số mỗi lần.

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 

- ========== Sau đó chạy phần này

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 

thể có ích cho khai thác gỗ khi sprocs hoặc quan điểm được chạy hoặc truy cập.

0

object_name() tự nó không xác định giản đồ của đối tượng hiện tại. Để làm điều đó:

print object_schema_name(@@PROCID) + '.' + object_name(@@PROCID) 
Các vấn đề liên quan