Хранимая процедура успешно создана, но ничего не делает - PullRequest
0 голосов
/ 24 сентября 2018

Хранимая процедура создана, но когда я пытаюсь вызвать ее, она ничего не вставляет и / или не обновляет.

Это мой код:

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» (дата), чем дата, которая уже есть в базе данных (это необходимо).После этого я проверяю, есть ли код категории в базе данных (это тоже необходимо).

Затем я обновляю одну таблицу и вставляю в другую.

Я использую цикл, потому что выбороператор возвращает более 1 записи.

Это моя база данных, с которой я работаю

1 Ответ

0 голосов
/ 24 сентября 2018

Если вы хотите выполнить более одного оператора после IF, вы должны использовать a begin ... end block .....

Youиметь это:

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
...