Có thể ghi lại các giá trị tham số đến trong một cuộc gọi thủ tục trong khi theo dõi trong SQL Server Profiler không?


13

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@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 aCursorhoạt động bên trong một WHILEvò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".


Nó không chỉ là 54 tham số có tổng :-) Tất cả các vòng lặp để gọi một con trỏ. Đó là tổng :-) Bạn đã chơi với SQL Explorer của Plan Sentry chưa? Bạn có thể sử dụng phiên bản miễn phí hoặc sử dụng bản dùng thử của phiên bản đầy đủ và có thể giúp bạn nếu bạn có một cuộc gọi với tất cả các tham số - sqlsentry.net/plan-explorer/sql-server-query-view.asp
Mike Walsh

Bạn có thể cho chúng tôi biết những sự kiện bạn đang chụp?
Mike Walsh

2
Lần duy nhất trình hồ sơ bắt được dữ liệu đó (tôi nghĩ) là khi bạn gọi nó? Hãy thử thiết lập một bảng kiểm toán với tất cả các thông số đó và chỉ cần thực hiện thao tác chèn trước khi lặp con trỏ của bạn?
jcolebrand

RPC: Đã hoàn thành hiển thị các giá trị tham số nhưng ở cấp độ bên ngoài.
Mike Walsh

3
+1 cho câu hỏi, như là sự bù đắp cho nỗi đau của bạn. Nếu tôi có thể, tôi sẽ +1 lần nữa để đăng câu hỏi mà không cần khám phá.
Mark Storey-Smith

Câu trả lời:


8

Tôi sẽ cắn viên đạn và nói với bạn rằng một dấu vết như vậy không thể được thiết lập, bởi vì đó không phải là mục đích [nhận thức] của dấu vết. Tôi đã luôn luôn làm theo cách này:

KHI (@@ FETCH_STATUS = 0) VÀ
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    - khoảng 700 dòng logic, toán học và nếu tham số-này-then-đó
    - những thứ bỏ qua
      INSERT InnerProcedureCallWithinLoop__TraceTable
              GIÁ TRỊ (@from_locn, @ Giới thiệu về 53PARAMOMEDED

      EXEC @ConsiderItem =
            InnerProcedureCallWithinLoop
                  @from_locn,
                        @ About53PARAMOMITTED,
...

Nếu tôi biết rằng nó chỉ được gọi từ một địa điểm. Nếu không, tôi làm điều đó trong callee thay vì người gọi.

ALTER PROC InnerProcedureCallWithinLoop
    @from_locn int,
    @About53PARAMSOMITTED ...
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
INSERT InnerProcedureCallWithinLoop__TraceTable VALUES (@from_locn, @prm2, @prm3....
--- rest of proc

Điều này rõ ràng khác với việc sử dụng dấu vết, có thể nắm bắt các sự kiện ngay cả khi chúng bắt đầu và không bao giờ kết thúc (các tham số bị lỗi, giao dịch quay trở lại). Nếu đó là vấn đề của bạn, bạn cần xem xét các phương pháp CLR hoặc email để đưa ra kết quả đầu ra.


Đó là những gì tôi nghĩ.
Warren P
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.