使用事务插入三个sql语句的存储过程

时间:2018-04-02 13:12:50

标签: c# sql-server winforms stored-procedures transactions

我的发票存储在两个表格中,第一张表格中包含发票的一般信息,如发票编号,日期等等。第二个表格包含发票中购买的商品的详细信息,如商品名称,数量,等等...... 我想创建一个存储过程,首先插入发票的一般信息,然后遍历发票的项目,这些项目将在datagridview行中逐个插入发票明细表中。并在每个细节中插入数量库存中的项目已更新,这使我的存储过程处理3个SQL查询 我已经编写了一个存储过程但是我在自己的存储过程中编写循环语句的部分卡住了。任何人都可以帮忙!

Create proc [dbo].[AddNewSellDetails]
@invoiceNo int,
@invoice_date date,
@SELL_ID int,
@PRO_ID int,
@QUANTITY varchar(10),
@UNIT nvarchar(15),
@PRICE varchar(20),
@AMOUNT varchar(20),
@DISCOUNT varchar(20),
@FINAL_TOT varchar(30)
as
begin transaction 
begin try

INSERT INTO Sell
(ID,sellDate) values (@invoiceNo,@invoice_date)

INSERT INTO Sell_Details
           (Sell_ID
           ,Product_ID
           ,Quantity
           ,Unit
           ,Price
           ,Amount
           ,Discount
           ,Final_Tot)   
     VALUES
           (@SELL_ID
           ,@PRO_ID
           ,@QUANTITY
           ,@UNIT
           ,@PRICE
           ,@AMOUNT
     ,@DISCOUNT
     ,@FINAL_TOT)

update Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
where Product.Product_ID=@PRO_ID

commit transaction 

end try
begin catch
rollback transaction 
end catch

1 个答案:

答案 0 :(得分:1)

您需要创建表值参数,如下所示

CREATE TYPE ProductDetails AS TABLE
(
        ProductID INT,
        QUANTITY VARCHAR(10),
        UNIT NVARCHAR(15),
        PRICE DECIMAL(18,2),
        AMOUNT DECIMAL(18,2),
        DISCOUNT DECIMAL(18,2),
        FINAL_TOT INT  
)
GO

然后创建如下的程序

CREATE PROCEDURE USP_AddNewSellDetails (@invoiceNo INT,@invoice_date DATE, @Produt_Detils ProductDetails READONLY)
AS
BEGIN
    BEGIN TRANSACTION
    INSERT INTO Sell
    (ID,sellDate) values (@invoiceNo,@invoice_date)

    INSERT INTO Sell_Details (Sell_ID ,Product_ID)   
    SELECT @invoiceNo, ProductID, QUANTITY ,UNIT ,PRICE ,AMOUNT ,DISCOUNT ,FINAL_TOT FROM @Produt_Detils

    DECLARE ProductDetilsCursor CURSOR FOR
        SELECT ProductID, QUANTITY FRM @Produt_Detils ORDER BY ProductID

        OPEN ProductDetilsCursor
        FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY

        WHILE ( @@FETCH_STATUS = 0)
        BEGIN
            UPDATE Product set Product.Quantity = Product.Quantity - CONVERT(float,@QUANTITY)
            WHERE Product.Product_ID=@ProductID

            FETCH NEXT FROM ProductDetilsCursor into @ProductID,@QUANTITY
        END
    CLOSE ProductDetilsCursor
    DEALLOCATE ProductDetilsCursor

    COMMIT TRANSACTION
END

在运行程序之前准备表值参数,如下所示

DECLARE @PD ProductDetails;
INSERT @PD VALUES (1,2,'KG',100,200,25,1),(2,5,'PC',50,250,20,6)

然后执行如下的程序

EXEC USP_AddNewSellDetails 100,'2-Apr-2018',@PD