Я пытаюсь этот сценарий, но он не дает правильный вывод - PullRequest
0 голосов
/ 03 ноября 2018

// *

WAP, который принимает deptno, dname в качестве ввода и вставить эти записи в таблицу dept.

если deptno уже существует, то приращение его значение на 10 и снова попробуйте вставить. вставка предлагается попробовать 5 раз и падая все 5 раз, распечатайте поговорку «Попробуй позже»

* //

Alter procedure sp_update (
    @dno int,
    @dname varchar(30)
)
as begin
    declare @rowcount int
    set @rowcount=@@ROWCOUNT
    if @rowcount<5 
    begin
    if not exists (select dno from dept where @dno=dno)
    begin
    insert into dept (dno,dname) values (@dno,@dname)
    end
    else
    begin
    print 'Try later'
    end
    end
    else
    begin
    set @dno=(select max(dno) from dept)
    set @dno=@dno+10
    insert into dept (dno,dname) values (@dno,@dname)
    end
end



exec sp_update 10,'HR'

Пожалуйста, дайте необходимый вывод.

1 Ответ

0 голосов
/ 03 ноября 2018

Переменная @rowcount в начале процедуры всегда равна <5, она никогда не войдет в сегмент, где "увеличивает свое значение на 10 и снова пытается вставить" .

РЕДАКТИРОВАТЬ: Чтобы узнать, сколько раз пользователь выполнил SP, вам нужно будет вставить в таблицу журнала, что-то вроде:

CREATE TABLE logSp (Username VARCHAR(200), ProcedureName VARCHAR(200), DateExecuted DATETIME)

И измените логику так:

ALTER PROCEDURE sp_update (
    @dno int,
    @dname varchar(30)
)
AS 
BEGIN
  DECLARE @sp_name VARCHAR(200) = 'sp_update'
  DECLARE @maxtimes VARCHAR(200) = 5
  DECLARE @user VARCHAR(200) = SUSER_NAME()

  DECLARE @times INT
  SELECT @times = count(1)
  FROM logSp
  WHERE Username = @user
    AND ProcedureName = @sp_name

  IF @times = @maxtimes
  BEGIN
    PRINT 'Try Again'
    RETURN
  END
  ELSE
  BEGIN
    INSERT INTO logSp values (@user, @sp_name, GETDATE())
  END

  IF NOT EXISTS (SELECT dno FROM dept WHERE @dno=dno)
  BEGIN
    INSERT INTO dept (dno,dname) VALUES (@dno,@dname)
  END
  ELSE
  BEGIN
    SET @dno=(SELECT MAX(dno) FROM dept)
    SET @dno=@dno+10
    INSERT INTO dept (dno,dname) VALUES (@dno,@dname)
  END
END

Кроме того, устанавливая переменную @dno равной max(id) + 10, вы гарантируете, что новый deptno не существует, вам не нужно пытаться 5 раз. Если вы хотите попробовать вставку 5 раз, вы должны использовать while.

...