在sqlserver中执行操作

时间:2013-12-06 13:20:52

标签: c# sql-server-2005

我正在使用C#,我必须从SQLServer(我的数据库)中检索数据。

我面临的问题是: 我有一个记录说'crocin'(药品名称),分为不同批次

Batch Nos  | Shelf nos | Available Medicine Quantity
B1         |  S1       |      30
B2         |  S1       |      30
B3         |  S1       |      30

(此分配根据其到期日期完成)

假设我的客户需要50种药物,那么我如何从SQLServer检索50种药物(即来自B1的30种和来自B2的20种药物)。(我想要帮助编写查询/程序等)< / p>

注意:我不能把所有药物都放在一批,比如B1,因为所有药物都必须按照有效期分开。

1 个答案:

答案 0 :(得分:0)

此脚本将按有效期顺序对每个批次进行处理,并根据要提取的项目数量从中减去项目。

以您的示例为例,假设B1在B2之前过期,则批次B1的项将更新为0,B2的项将更新为10。

这是完全未经测试的,我不知道这是否真的是您要实现的目标,但这是我的努力。

CREATE OR ALTER PROCEDURE FetchMedicine
(
    @AmountToFetch int
)
AS
BEGIN
    declare @TableRowOffset int = 0;
    declare @BatchIdPtr int = 0;
    while(@AmountToFetch > 0)
    BEGIN
        set @BatchIdPtr = (Select Id from [Batch] where Quantity > 0 order by [ExpiryDate] OFFSET @TableRowOffset ROW FETCH NEXT 1 ROW ONLY)
        declare @BatchQuantity int = (select top 1 Quantity from [Batch] where Id = BatchIdPtr)

        if(@BatchQuantity > @AmountToFetch)
        BEGIN
            update [Batch] set Quantity = (@BatchQuantity - @AmountToFetch) where Id = @BatchIdPtr
            BREAK;
        END
        ELSE
        BEGIN
            update [Batch] set Quantity = 0 where Id = @BatchIdPtr
            set @AmountToFetch = @AmountToFetch - @BatchQuantity
        END

        set @TableRowOffset = @TableRowOffset + 1
    END
END