【问题标题】:I'm trying this scenario but it is not giving correct output我正在尝试这种情况,但它没有给出正确的输出
【发布时间】:2018-11-03 17:33:37
【问题描述】:

//*

WAP 将 deptno,dname 作为输入和 将该记录插入到 dept 表中。

如果deptno已经存在,则递增 将其值加 10 并再次尝试插入。 insert 应该被尝试 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'

请给出所需的输出。

【问题讨论】:

  • 一些好的格式(特别是缩进)将使 SQL 更容易阅读,所有这些 ifs

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


【解决方案1】:

过程开始时的@rowcount变量总是&lt;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 次 INSERT,则必须使用 while

【讨论】:

  • 但是这段代码并没有限制以上5次,
  • 如果用户执行 sp 超过 5 次,则不允许插入并显示类似“稍后尝试”的消息
  • 在这种情况下,您必须记录用户运行 SP 的次数(例如日志表)。我已经编辑了答案,包括一个日志表来进行检查。
  • 当然这会很好,但不是我的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多