【问题标题】:Stored procedure successfully created, but doesn't do anything存储过程创建成功,但不执行任何操作
【发布时间】:2019-02-28 08:39:36
【问题描述】:

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

这是我的代码:

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 语句返回超过 1 条记录。

This is my database I'm working with

【问题讨论】:

  • 哪个 dbms? (sql server?)
  • 是的,微软Sql管理工作室
  • 是否显示任何错误信息?
  • 不,它没有....

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


【解决方案1】:

如果你想在IF 之后执行多个语句,你必须使用 begin ... end 块.....

你有这个:

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 条件不匹配时——你只是无条件地从过程中返回,其余的代码从不执行...... p>

你需要这样写:

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

【讨论】:

  • @MFox:如果这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
  • 对不起,我对 stackoverflow 很陌生
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 2016-07-31
  • 2018-10-20
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2019-05-07
相关资源
最近更新 更多