ใช้ SQL Server Profiler (ฉันใช้ SQL Server 2012) ฉันพยายามสร้างการติดตามที่มีประโยชน์ที่แสดงค่าพารามิเตอร์ไม่ใช่เฉพาะ SQL ที่มีชื่อตัวแปร ขั้นตอนที่เก็บไว้จะนำข้อมูลคลังมารวมเพื่อสร้างผลลัพธ์ที่มีค่าอย่างยิ่งและฉันพยายามบันทึกพฤติกรรมที่มีอยู่แล้วดังนั้นฉันจึงสามารถทดสอบหน่วยกำหนดมันอย่างชัดเจนและกำหนดให้เป็นสิ่งที่มีสติ
ฉันมีโพรซีเดอร์ที่เก็บไว้ซึ่งดำเนินการโพรซีเดอร์ย่อย 54 พารามิเตอร์ในลูปที่โพรซีเดอร์ที่เก็บสร้างเคอร์เซอร์จากนั้นก็ทำลูปสักครู่ นี่คือมุมมองที่เรียบง่าย:
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        ฉันจะได้รับการติดตามเพื่อแสดงค่าพารามิเตอร์ทั้งหมดที่ส่งถึง 
 InnerProcedureCallWithinLoopฉันได้อย่างไร มี 54 พารามิเตอร์ ฉันต้องเขียน "54 บรรทัดของ debug-printfs" ใน SQL ของฉันหรือฉันสามารถถ่ายโอนค่าพารามิเตอร์ทั้งหมดของการเรียกโพรซีเดอร์ขณะที่ทำการติดตาม SQL ได้อย่างไร?
เมื่อฉันได้รับการติดตามในตอนนี้ฉันจะได้รับผลลัพธ์นี้:
EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmittedสิ่งที่ผมอยากจะทราบว่าเป็นที่@from_locn = 1และ@About53ParmsOmitted = 'hello world'และอื่น ๆ
@from_locnนี้ไม่ได้บอกฉันค่าที่แท้จริงของพารามิเตอร์ ในกรณีของพารามิเตอร์แรกนั้นมันถูกส่งผ่านไปยังขั้นตอนการจัดเก็บระดับบนสุดของฉันดังนั้นฉันรู้ว่ามันเป็น 0 หรือ 1 เนื่องจากกรณีอาจ อย่างไรก็ตามประมาณ 40 จาก 43 params ในกระบวนงานภายในนั้นมาจากการFETCH NEXT FROM aCursorดำเนินการภายในWHILEลูป
ในขณะนี้การติดตามบอกฉันว่ามีกี่ครั้งที่InnerProcedureCallWithinLoopถูกเรียกใช้และใช้เวลานานเท่าใด แต่ไม่ได้มีค่าของพารามิเตอร์สำหรับการโทรนั้นเท่าไหร่ ถ้าฉันจะได้รับ "สคริปต์ SQL แบบสแตนด์อโลนที่รันได้" ซึ่งทำซ้ำบางส่วนของมุมที่ฉันพบในรหัสของฉันในขณะที่ติดตามสคริปต์เหล่านี้การตั้งค่าฟังก์ชั่นรวมเหล่านี้ (ฉันรู้ว่า 54 พารามิเตอร์นั่นคือขั้นต้นจริงๆ แต่ฉันไม่ได้เขียน พวกเขา!) อาจใช้เวลาหนึ่งชั่วโมงในการพิมพ์เพียงเพื่อสร้างสคริปต์ SQL ที่ให้ฉันเรียกใช้มุมตัวเองนี้นอกคำรามขนาดใหญ่ของ SQL Server ที่เก็บไว้
นี่เป็นส่วนหนึ่งของความพยายามที่จะเจาะลึกถึงนิพจน์ SQL และสร้างสคริปต์ที่สามารถตรวจสอบขั้นตอนการจัดเก็บที่ซับซ้อนเหล่านี้ได้
อัปเดตฉันพบตัวเลือกการบันทึก "Output Param" RPC แต่ไม่ใช่ตัวเลือกการบันทึก "RPC IN PARAM"