2008-09-29 20 views
16

Có thể tìm ra ai được gọi là thủ tục lưu trữ không?Tìm hiểu quy trình lưu trữ cuộc gọi trong SQL Server

Ví dụ: giả sử tôi gặp lỗi trong số proc3. Từ trong đó proc tôi muốn biết nếu nó được gọi là proc1 hoặc proc2.

+6

Bạn có thể biết tên của SP hiện tại bằng cách nhận 'OBJECT_NAME (@@ PROCID)' – Gman

Trả lời

8

Tôi sẽ sử dụng thông số đầu vào bổ sung, để chỉ định nguồn, nếu điều này quan trọng đối với logic của bạn.

Điều này cũng sẽ giúp việc chuyển cơ sở dữ liệu của bạn sang nền tảng khác dễ dàng hơn vì bạn không phụ thuộc vào một số chức năng phụ thuộc nền tảng tối nghĩa.

3

Bạn có cần biết trong proc3 tại thời gian chạy gây ra lỗi hoặc bạn chỉ cần biết khi gỡ lỗi?

Bạn có thể sử dụng SQL Server profiler nếu bạn chỉ cần thực hiện trong khi gỡ lỗi/giám sát.

Nếu không vào năm 2005, tôi không tin rằng bạn có khả năng ngăn xếp theo dõi.

Để làm việc xung quanh nó, bạn có thể thêm và thêm tham số vào proc3, @CallingProc hoặc một cái gì đó tương tự.

HOẶC bạn có thể thêm try catch blocks vào proc1 và proc2.

BEGIN TRY 
EXEC Proc3 
END TRY 
BEGIN CATCH 
SELECT 'Error Caught' 
SELECT 
    ERROR_PROCEDURE() 
END CATCH 

Tốt tham khảo ở đây: http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1189087,00.html

và tất nhiên luôn SQL Server Books Online

SQL Server 2008 không có khả năng gỡ lỗi thông qua thủ tục tuy nhiên.

2

Bạn có thể có proc1 và proc2 chuyển tên của chúng vào proc3 làm tham số.

Ví dụ:

CREATE PROCEDURE proc3 
    @Caller nvarchar(128) -- Name of calling proc. 
    AS 
    BEGIN 
    -- Produce error message that includes caller's name. 
    RAISERROR ('Caller was %s.', 16,10, @Caller); 
    END 
    GO 

    CREATE PROCEDURE proc1 
    AS 
    BEGIN 
    -- Get the name of this proc. 
    DECLARE @ProcName nvarchar(128); 
    SET @ProcName = OBJECT_NAME(@@PROCID); 
    -- Pass it to proc3. 
    EXEC proc3 @ProcName 
    END 
    GO 

    CREATE PROCEDURE proc2 
    AS 
    BEGIN 
    -- Get the name of this proc. 
    DECLARE @ProcName nvarchar(128); 
    SET @ProcName = OBJECT_NAME(@@PROCID); 
    -- Pass it to proc3. 
    EXEC proc3 @ProcName 
    END 
    GO 
3

Không có cách nào tự động tốt đẹp để làm điều này (than ôi). Vì vậy, nó thực sự phụ thuộc vào bao nhiêu bạn đang chuẩn bị để (lại) viết procs của bạn để có thể làm điều này.

Nếu bạn có cơ chế ghi nhật ký, bạn có thể đọc nhật ký và tìm ra ai đã gọi cho bạn.

Ví dụ, nếu bạn thực hiện khai thác gỗ bằng cách chèn vào một bảng, ví dụ:

CREATE TABLE Log 
(timestamp dattime, 
spid  int, 
procname varchar(255), 
message varchar(255)) 

... text of proc ... 
INSERT INTO Log 
SELECT get_date(), @@spid, @currentproc, 'doing something' 
-- you have to define @currentproc in each proc 

-- get name of caller 
SELECT @caller = procname 
FROM Log 
WHERE spid = @@spid 
AND timestamp = (SELECT max(timestamp) 
        FROM Log 
        WHERE timestamp < get_date() 
        AND procname != @currentproc) 

này sẽ không hoạt động cho các cuộc gọi đệ quy, nhưng có lẽ ai đó có thể khắc phục điều đó?

Các vấn đề liên quan