2017-10-07 105 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列是表中的整数,则应该为变量使用相同的数据类型。尝试使用传递给过程的参数来执行一个简单的选择,它也不应该返回任何行。 –

相关问题