我正在尝试这种情况,但没有给出正确的输出

时间:2018-11-03 17:33:37

标签: sql sql-server sql-server-2012

// *

WAP,它以deptno,dname作为输入, 将该记录插入到部门表中。

如果已经存在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 :(得分:0)

该过程开始时的@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