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
.
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
.
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.
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.
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
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 đó?
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