Переменная @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
.