存储过程已创建,但是当我尝试调用它时,它不会插入和/或更新任何内容。
这是我的代码:
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语句返回多个记录。
答案 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