我正在开发用于库存管理的桌面应用程序。无法使用存储过程从SQL Server表中删除记录
我在SQL Server中3个表:
- 交易
- MATERIAL_TRANSACTION
- 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
@ID参数被声明为nvarchar(50),但代码中的文字是整数。该参数应该与基础表中的“TRANSACTION_ID”的数据类型相匹配。 –
未来版本的SQL Server中将删除'ntext','text'和'image'数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前正在使用它们的应用程序。改为使用'nvarchar(max)','varchar(max)'和'varbinary(max)'。 [请参阅此处](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –