Sử dụng SQL Server Profiler (Tôi đang sử dụng SQL Server 2012), tôi đang cố gắng tạo ra một dấu vết hữu ích hiển thị các giá trị tham số, không chỉ SQL với tên biến. Quy trình được lưu trữ đi qua một lượng lớn dữ liệu Hàng tồn kho để tạo ra một số kết quả cực kỳ có giá trị và tôi đang cố gắng ghi lại hành vi hiện có, vì vậy tôi có thể kiểm tra nó, xác định chính xác và sau đó cấu trúc lại nó thành một thứ gì đó lành mạnh.
Tôi có một thủ tục được lưu trữ để thực hiện thủ tục con 54 tham số, bên trong một vòng lặp trong đó thủ tục được lưu trữ tạo ra một con trỏ sau đó thực hiện một vòng lặp while. Đây là một cái nhìn đơn giản hóa:
CREATE PROCEDURE
[dbo].[OuterProcedure]
( @ProductCode varchar(8),
-- 41 more parameters omitted
)
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
-- OMIT ABOUT 10 temporary table declarations.
DECLARE aCursor CURSOR FAST_FORWARD FOR
SELECT [ID],bkno, -- about 40 fields omitted.
FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins
WHERE (about_80_boolean_expressions AND omitted_here)
ORDER BY some,keys,like,this
OPEN aCursor
FETCH NEXT FROM aCursor /* Get First Record */
INTO @ID, @about_40_fields,....
WHILE (@@FETCH_STATUS = 0) AND
( @About80MoreBooleanExpressionsHere)
BEGIN /* 1 */
-- about 700 lines of logic, math and if-parameter-this-then-that
-- stuff omitted
EXEC @ConsiderItem =
InnerProcedureCallWithinLoop
@from_locn,
@About53PARAMSOMITTED,
...
FETCH NEXT FROM CurInventory /* Get Next Record */
INTO @ID,@MoreStuff,...
END
CLOSE CurInventory
DEALLOCATE CurInventory
Làm thế nào tôi có được một dấu vết để hiển thị cho tôi tất cả các giá trị tham số được truyền vào
InnerProcedureCallWithinLoop
? Có 54 thông số. Tôi có phải viết về cơ bản "54 dòng debug-printfs" trong SQL của mình không hoặc tôi có thể bỏ tất cả các giá trị tham số của một cuộc gọi thủ tục trong khi thực hiện SQL theo dõi một số cách không?
Khi tôi nhận được một dấu vết ngay bây giờ, tôi nhận được kết quả này:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
Những gì tôi muốn biết là @from_locn = 1
và @About53ParmsOmitted = 'hello world'
vân vân.
Điều này không cho tôi biết giá trị thực của tham số @from_locn
. Trong trường hợp tham số đầu tiên đó, nó được chuyển đến thủ tục được lưu trữ ở mức cao nhất của tôi, vì vậy tôi biết đó là 0 hoặc 1, tùy theo từng trường hợp. Tuy nhiên, khoảng 40 trong số 43 params trong quy trình bên trong đó đến từ FETCH NEXT FROM aCursor
hoạt động bên trong một WHILE
vòng lặp.
Ngay bây giờ theo dõi cho tôi biết bao nhiêu lần InnerProcedureCallWithinLoop
được gọi, và mỗi lần mất bao lâu, nhưng không phải là giá trị của các tham số cho cuộc gọi đó. Nếu bằng cách nào đó tôi có thể nhận được "tập lệnh SQL độc lập có thể chạy được" sao chép một số trường hợp góc mà tôi tìm thấy trong mã của mình, trong khi truy tìm các tập lệnh này, thiết lập các hàm tổng này (tôi biết, 54 tham số, thực sự rất thô, nhưng tôi đã không viết chúng!) có thể khiến tôi mất một giờ gõ chỉ để xây dựng tập lệnh SQL cho phép tôi tự mình gọi trường hợp góc này, bên ngoài quy trình lớn này của quy trình lưu trữ SQL Server.
Đây là một phần trong nỗ lực đi sâu vào biểu thức SQL và xây dựng các tập lệnh có thể thăm dò các thủ tục được lưu trữ phức tạp này.
Cập nhật Tôi tìm thấy tùy chọn ghi "RPC IN PARAM", nhưng không phải là tùy chọn ghi "RPC IN PARAM".