2013-07-06 40 views
0

我有一個存儲過程,它的任務是,它將一個文件並將記錄傳輸到TEMP表中,然後它將進行相應的驗證,然後它將把這些記錄放入主臨時表(有時候我們還有3個表爲驗證目的,而這些都是StockIntegrityCheck,IntegrityErrorLog,InterfaceIntegrity)如何使用PRINT語句跟蹤存儲過程執行?

問題:當一個空文件已經到來(0KB文件),這是不應該把任何進入任何表中。但它將在不需要的IntegrityErrorLog表中輸入一個條目。我想要相應地更正存儲過程?

這裏是SP:

USE [PARAM.DB] 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].  [usp_LDMDB_GMIH_DSOA_STAGING]') AND type in (N'P')) 
DROP PROCEDURE [dbo].[usp_LDMDB_GMIH_DSOA_STAGING] 

GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

/* 
Description: This program will insert records from LDMDB_GMIH_DSO_A_STAGING_TEMP table to LDMDB_GMIH_DSO_A_STAGING table 
*/ 

CREATE PROCEDURE [dbo].[usp_LDMDB_GMIH_DSOA_STAGING] 
AS 

DECLARE 
    @DATA VARCHAR(200), 
    @HDRDATA VARCHAR(200), 
    @FLAG INT, 
    @ErrStmt VARCHAR(500), 
    @ProcessDate datetime, 
    /* Stock Integrity Changes for I0180 Starts */ 
    @Integritycheck INT, 
    @Totalcount VARCHAR(10), 
    @Totalquantity VARCHAR(10), 
    @TrackingID VARCHAR(20), 
    @count INT, 
    @quantity INT;  
    /* Stock Integrity Changes for I0180 Ends */ 
BEGIN 
    BEGIN TRANSACTION 
    select @ProcessDate = GETDATE() 
    /* Stock Integrity Changes for I0180 Starts */ 
    SET @count = 0; 
    SET @quantity = 0; 
    SET @Integritycheck = (SELECT Value from dbo.LDMStockIntegrityCheck where interfacename = 'I0180' and filename = 'PIZ.HW.NDC.CALLOFF.FILE.LDM'); 

    /* Stock Integrity Changes for I0180 Ends */ 
    DECLARE CUR_JOB CURSOR LOCAL 
    FOR 
    SELECT DATA FROM LDMDB_GMIH_DSO_A_STAGING_TEMP ORDER BY ROW_ID 
    OPEN CUR_JOB 

    IF @@ERROR <> 0 
    BEGIN 
    SET @ErrStmt= 'Error while Opening the Cursor' 
    GOTO ERRHDL 
    END 
    -- LOOPING THROUGH EACH RECORD. 
    FETCH NEXT FROM CUR_JOB INTO @DATA 

    IF @@ERROR <> 0 
    BEGIN 
    SET @ErrStmt= 'Error while Fetching the Record From Cursor' 
    GOTO ERRHDL 
    END 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    SET @FLAG = 0 
    IF(SUBSTRING (@DATA,1,1)= '1') 
    BEGIN 
     SET @HDRDATA = @DATA 
     SET @FLAG = 0 
     /* Stock Integrity Changes for I0180 Starts */ 

     IF (@Integritycheck = 1) 
     BEGIN 
     SET @TrackingID = SUBSTRING(@data,19,20); 
     SET @Totalcount = CONVERT(INT,SUBSTRING(@data,39,10)); 
     SET @Totalquantity = CONVERT(INT,SUBSTRING(@data,49,15)); 
     END 

     /* Stock Integrity Changes for I0180 Ends */  
    END 

    IF(SUBSTRING (@DATA,1,1)= '5') 
    BEGIN 
     SET @FLAG = 1 
     /* Stock Integrity Changes for I0180 Starts */ 
     IF (@Integritycheck = 1) 
     BEGIN 
     SET @count= @count +1 ; 
     SET @quantity = @quantity + CONVERT(INT,SUBSTRING(@data,45,09)) ; 
     END 
     /* Stock Integrity Changes for I0180 Ends */ 
    END 

    IF (@FLAG = 1) 
    BEGIN 
     INSERT INTO LDMDB_GMIH_DSO_A_STAGING 
     ( FileCreationDate, 
      GenerationNumber, 
      WAREHOUSE_CODE, 
      ALLOC_RUN_DATE, 
      SUPP_CODE, 
      SUPP_LOC_CODE, 
      PICKSHEET_NUM, 
      UPC, 
      DELIVERY_POINT, 
      STORE_NUM, 
      VALUE_TOTAL_SEND, 
      COUNTRY_CODE, 
      DISPATCH_PRIORITY, 
      QTY, 
      ProcessDate 
    ) 
     SELECT LTRIM(RTRIM(SUBSTRING(convert(varchar(20),(CONVERT(datetime, SUBSTRING (@HDRDATA,2,8), 111)),121),1,10))) FileCreationDate, 
       LTRIM(RTRIM(SUBSTRING (@HDRDATA,10,9))) GenerationNumber, 
       LTRIM(RTRIM(SUBSTRING (@DATA,2,3)))  WAREHOUSE_CODE , 
       LTRIM(RTRIM(SUBSTRING(convert(varchar(20),(CONVERT(datetime, SUBSTRING (@DATA,5,8), 111)),121),1,10))) ALLOC_RUN_DATE, 
       RIGHT(REPLICATE('0',10) + LTRIM(RTRIM(SUBSTRING (@DATA,13,4))),5) SUPP_CODE, 
       LTRIM(RTRIM(SUBSTRING (@DATA,17,5))) SUPP_LOC_CODE, 
       LTRIM(RTRIM(SUBSTRING (@DATA,22,6))) PICKSHEET_NUM, 
       LTRIM(RTRIM(SUBSTRING (@DATA,29,8))) UPC, 
       LTRIM(RTRIM(SUBSTRING (@DATA,37,4))) DELIVERY_POINT, 
       LTRIM(RTRIM(SUBSTRING (@DATA,41,4))) STORE_NUM, 
       (SELECT CASE WHEN cast(SUBSTRING (@DATA,45,9) AS NUMERIC) < 0 THEN ('-' + LTRIM(RTRIM(SUBSTRING (@DATA,46,8)))) ELSE LTRIM(RTRIM(SUBSTRING (@DATA,45,9))) END) VALUE_TOTAL_SEND, 
       LTRIM(RTRIM(SUBSTRING (@DATA,54,3))) COUNTRY_CODE, 
       LTRIM(RTRIM(SUBSTRING (@DATA,57,2))) DISPATCH_PRIORITY, 
       LTRIM(RTRIM(SUBSTRING (@DATA,59,9))) QTY, 
       @ProcessDate 

     IF @@ERROR <> 0 
     BEGIN 
     SET @ErrStmt= 'Error while Inserting the Records into the Staging Table' 
     GOTO ERRHDL 
     END 
    END 

    FETCH NEXT FROM CUR_JOB INTO @DATA 
    END 

    CLOSE CUR_JOB 
    DEALLOCATE CUR_JOB 
    IF (@Integritycheck = 0) 
    BEGIN 
    COMMIT TRANSACTION 
    END 

    FINISH: 
    BEGIN 
    /* Stock Integrity Changes for I0180 Starts */ 
    IF (@Integritycheck = 0) 
    BEGIN 
     SET @ErrStmt= 'Inserting the Records into the Staging Table Successful' 
     PRINT 'Inserting the Records into the Staging Table Successful' 
     Return 
    END 

    ELSE 
    BEGIN 

     IF ((@count = @Totalcount)AND(@quantity = @Totalquantity)) 
     BEGIN 
     INSERT INTO dbo.LDMInterfaceIntegrity VALUES ('I0180','PIZ.HW.NDC.CALLOFF.FILE.LDM',@TrackingID,@Totalquantity,@Totalcount,@ProcessDate); 
     COMMIT TRANSACTION;    
     BEGIN 
      SET @ErrStmt= 'Inserting the Records into the Staging Table Successful'; 
      Return 
     END  

     END 
     ELSE 
     BEGIN 
     ROLLBACK TRANSACTION; 
     IF (@count <> @Totalcount) 
     BEGIN         
      INSERT INTO dbo.LDMIntegrityErrorLog VALUES ('I0180','PIZ.HW.NDC.CALLOFF.FILE.LDM',@TrackingID,'Count Mismatch',@ProcessDate); 
      PRINT 'Count mismatch'; 
     END 
     ELSE 
     BEGIN 

      INSERT INTO dbo.LDMIntegrityErrorLog VALUES ('I0180','PIZ.HW.NDC.CALLOFF.FILE.LDM',@TrackingID,'Quantity Mismatch',@ProcessDate); 
      PRINT 'Quantity Mismatch'; 
     END 

     RETURN; 
     END 
    END 
    /* Stock Integrity Changes for I0180 Ends */ 
    END 
    ERRHDL: 
    BEGIN 
    ROLLBACK TRANSACTION 
    RETURN    
    END 

END 
+0

你需要更具體的瞭解你想* *發生,什麼*的*發生。在這裏有相當多的代碼需要涉及,其中一些代碼依賴於其他表格等,只是猜測你的問題是很難的(甚至不清楚你有什麼時候想做什麼0字節的文件)......但是,FWIW無論如何我會冒險 - NULL值不相等,不可比。 –

+0

對不起,其中的描述不正確。我想在存儲過程中知道,當一個0 KB文件作爲輸入時,所有值(Count,quantity,totalcount和totalquantity)是什麼。我只想給PRINT語句無論數量和數量在哪裏。理想情況下,我想跟蹤計數,數量,總數和總量的值。請幫助我瞭解如何跟蹤這些值 –

回答

0

Sql服務器管理工​​作室提供調試存儲過程的工具。通過調試存儲過程,您可以檢查每個變量的值以及執行存儲過程期間執行的哪個語句。 只需將調試點放入存儲過程中的語句中並按調試即可。

檢查http://www.youtube.com/watch?v=618LE_FZCxI

相關問題