【问题标题】:Stored procedure to insert three sql statements with transaction [closed]使用事务插入三个 sql 语句的存储过程[关闭]
【发布时间】:2018-09-11 17:06:07
【问题描述】:

我有一张发票,它存储在两个表中,第一个表包含发票的一般信息,如发票编号、日期等。第二个表包含发票中购买的项目的详细信息,如项目名称、数量等等...
我想创建一个存储过程,首先插入发票的一般信息,然后循环遍历将在 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

【问题讨论】:

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多