存储过程已成功创建,但不执行任何操作

时间:2018-09-24 19:23:41

标签: sql-server stored-procedures while-loop sql-update sql-insert

存储过程已创建,但是当我尝试调用它时,它不会插入和/或更新任何内容。

这是我的代码:

use KlantArtikelMathijs
GO

alter procedure SPVerhoogPrijzen 
    @catcode varchar(32),
    @ingangsdatum date
as
begin 
    declare @artikelnr int;
    declare @prijs decimal(8,2);

    if(@ingangsdatum < GETDATE())
        raiserror('deze datum is in het verleden, kies een andere datum', 16,1)
        return

    if(@catcode not in (select catcode from artikel))
        raiserror('Deze categorie bestaat niet, maak eerst een artikel met deze categorie aan', 16 , 1)
        return

    declare @counter int = 0

    while @counter < (select count(artikelnr) from artikel where catcode = @catcode)
    begin
        set @artikelnr = (select artikelnr from artikel where catcode = @catcode)
        set @prijs = (select sum(prijs*1.1) from artikelprijs where artikelnr = @artikelnr)

        update artikelprijs
        set einddatum = dateadd(day,-1,@ingangsdatum)
        where artikelnr = @artikelnr

        insert into artikelprijs (artikelnr, prijs, begindatum, einddatum)
        values (@artikelnr, @prijs, @ingangsdatum, '2099-12-31')

        set @counter = @counter + 1

        if @counter = 3
        begin
            break
        end
    end
end 

首先,我要检查“ ingangsdatum”(日期)是否大于数据库中已经存在的日期(这是必需的)。之后,我检查类别代码是否在数据库中(这也是必要的)。

然后我更新一个表并插入另一个表。

我正在使用循环,因为select语句返回多个记录。

This is my database I'm working with

1 个答案:

答案 0 :(得分:4)

如果要在IF后执行多条语句,则必须使用 begin ... end块..... < / p>

你有这个:

if(@ingangsdatum < GETDATE())
    raiserror('deze datum is in het verleden, kies een andere datum', 16,1)
    return

但这-经过适当缩进和书写-确实是:

if(@ingangsdatum < GETDATE())
    raiserror('deze datum is in het verleden, kies een andere datum', 16,1)

return

return 属于IF子句代码-每次执行每次都执行该操作!因此,当IF条件不匹配时-您只需无条件地从过程中返回,其余代码将从不执行……

您需要这样写:

if(@ingangsdatum < GETDATE())
begin     -- add the "begin" to start the block of code
    raiserror('deze datum is in het verleden, kies een andere datum', 16,1)
    return
end       -- add the "end" to close the block of code