2017-10-07 112 views
0

我正在開發用於庫存管理的桌面應用程序。無法使用存儲過程從SQL Server表中刪除記錄

我在SQL Server中3個表:

  1. 交易
  2. MATERIAL_TRANSACTION
  3. TRANSACTION_DETAILS

我創建了一個存儲過程來插入以及更新上述所有表。

TRANSACTIONS是我的主表。所以,我使用更新查詢來更新其列。 但是在將新行插入數據庫之前,需要刪除其他兩個表(即詳細表)的記錄。

我無法刪除此存儲過程中的行。請幫忙!

我用下面的SQL Server存儲過程

ALTER PROCEDURE [dbo].[SAVE_TRANSACTION] 
    @ID NVARCHAR(50), 
    @REF_NO NVARCHAR(50), 
    @VCH_DATE DATE, 
    @VCH_TYPE INT, 
    @CR_AC INT, 
    @DR_AC INT, 
    @DOCKET_NO NVARCHAR(50), 
    @TRANSPORT NVARCHAR(50), 
    @DELIVERY_NOTE NTEXT, 
    @S_NAR NVARCHAR(100), 
    @L_NAR NTEXT, 
    @IS_REVERSE_CHARGE INT, 
    @INVOICE_REF INT, 
    @BUYER NVARCHAR(50), 
    @BUYER_CONTACT NVARCHAR(50), 
    @BUYER_ADDRESS NTEXT, 
    @BUYER_GSTIN NVARCHAR(50), 
    @BUYER_STATE NVARCHAR(50), 
    @BUYER_REG_TYPE INT, 
    @MATERIAL_TRANSACTION dbo.TVP_MATERIAL_TRANSACTION READONLY, 
    @TRANSACTION_DETAILS dbo.TVP_TRANSACTION_DETAILS READONLY, 
    @RETURN INT OUTPUT 
AS 
    DECLARE @TRAN_ID INT 
BEGIN 
    SET NOCOUNT ON; 

    DELETE FROM MATERIAL_TRANSACTION 
    WHERE ID > 0 
     AND TRANSACTION_ID = @ID; 

    DELETE FROM TRANSACTION_DETAILS 
    WHERE ID > 0 
     AND TRANSACTION_ID = @ID; 

    IF (@ID = 0) 
    BEGIN 
     INSERT INTO dbo.TRANSACTIONS(REF_NO, VCH_DATE, VCH_TYPE, CR_AC, DR_AC, 
            DOCKET_NO, TRANSPORT, DELIVERY_NOTE, 
            S_NAR, L_NAR, IS_REVERSE_CHARGE, 
            INVOICE_REF, BUYER, BUYER_CONTACT, BUYER_ADDRESS, 
            BUYER_GSTIN, BUYER_STATE, BUYER_REG_TYPE) 
     VALUES (@REF_NO, @VCH_DATE, @VCH_TYPE, @CR_AC, @DR_AC, 
       @DOCKET_NO, @TRANSPORT, @DELIVERY_NOTE, 
       @S_NAR, @L_NAR, @IS_REVERSE_CHARGE, 
       @INVOICE_REF, @BUYER, @BUYER_CONTACT, @BUYER_ADDRESS, 
       @BUYER_GSTIN, @BUYER_STATE, @BUYER_REG_TYPE); 

     SET @TRAN_ID = @@IDENTITY 
    END 
    ELSE 
    BEGIN 
     UPDATE dbo.TRANSACTIONS 
     SET REF_NO = @REF_NO, 
      VCH_DATE = @VCH_DATE, VCH_TYPE = @VCH_TYPE, 
      CR_AC = @CR_AC, DR_AC = @DR_AC, 
      DOCKET_NO = @DOCKET_NO, 
      TRANSPORT = @TRANSPORT, DELIVERY_NOTE = @DELIVERY_NOTE, 
      S_NAR = @S_NAR, L_NAR = @L_NAR, 
      IS_REVERSE_CHARGE = @IS_REVERSE_CHARGE, 
      INVOICE_REF = @INVOICE_REF, 
      BUYER = @BUYER, BUYER_CONTACT = @BUYER_CONTACT, 
      BUYER_ADDRESS = @BUYER_ADDRESS, 
      BUYER_GSTIN = @BUYER_GSTIN, BUYER_STATE = @BUYER_GSTIN, 
      BUYER_REG_TYPE = @BUYER_REG_TYPE 
     WHERE 
      ID = @ID; 

     SET @TRAN_ID = @ID; 
    END 

    --UPDATE MATERIAL_TRANSACTION SET IS_DELETED=1 WHERE [email protected]; 
    -- UPDATE TRANSACTION_DETAILS SET IS_DELETED=1 WHERE [email protected]; 
    INSERT INTO TRANSACTION_DETAILS (TRANSACTION_ID, AC_ID, TRAN_TYPE, 
            CR_AMT, DR_AMT, AMT_PERCENT, IS_PARENT) 
     SELECT 
      @TRAN_ID, [AC_ID], [TRAN_TYPE], 
      [CR_AMT], [DR_AMT], [AMT_PERCENT], [IS_PARENT] 
     FROM 
      @TRANSACTION_DETAILS TVP 

    INSERT INTO MATERIAL_TRANSACTION (TRANSACTION_ID, PRODUCT_ID, QTY, 
             UNIT_ID, DESCRIPTION, HSN_CODE, 
             PRICE, DISCOUNT_AMT, DISCOUNT_PERCENT, 
             CGST_PERCENT, SGST_PERCENT, IGST_PERCENT, 
             CGST_AMT, SGST_AMT, IGST_AMT) 
     SELECT 
      @TRAN_ID, [PRODUCT_ID], [QTY], 
      [UNIT_ID], [DESCRIPTION], [HSN_CODE], 
      [PRICE], [DISCOUNT_AMT], [DISCOUNT_PERCENT], 
      [CGST_PERCENT], [SGST_PERCENT], [IGST_PERCENT], 
      [CGST_AMT], [SGST_AMT], [IGST_AMT] 
     FROM 
      @MATERIAL_TRANSACTION TVP 

    SELECT @RETURN = @TRAN_ID 
END 
+0

@ID參數被聲明爲nvarchar(50),但代碼中的文字是整數。該參數應該與基礎表中的「TRANSACTION_ID」的數據類型相匹配。 –

+0

未來版本的SQL Server中將刪除'ntext','text'和'image'數據類型。避免在新的開發工作中使用這些數據類型,並計劃修改當前正在使用它們的應用程序。改爲使用'nvarchar(max)','varchar(max)'和'varbinary(max)'。 [請參閱此處](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

回答

0

你能否澄清,當你執行過程究竟怎樣呢?爲什麼你無法刪除行?你是否收到一些錯誤信息,或者根本沒有行被刪除?

+0

我沒有收到任何錯誤。與where子句一起使用時,刪除查詢將被簡單地跳過。如果沒有where子句,它會執行以截斷表 –

+0

如果您給我們提供一個示例數據,它可能會有所幫助,但據我所知,SQL Server未找到符合所用條件的任何行。如果ID列是表中的整數,則應該爲變量使用相同的數據類型。嘗試使用傳遞給過程的參數來執行一個簡單的選擇,它也不應該返回任何行。 –

相關問題