【问题标题】:SQL Procedure not working according to sequenceSQL过程不按顺序工作
【发布时间】:2013-05-29 06:00:54
【问题描述】:

我想为登录表写存储过程。

此过程涉及检查LogInID是否已经存在,如果存在则不允许插入具有相同LogInID的记录。

我的程序如下:

ALTER PROCEDURE logTRAN
@id   varchar(25),
@pass varchar(25)
AS
BEGIN TRANSACTION

insert into login values(@id,@pass)

IF EXISTS (select count(*) from login where LogInID=@id)
    BEGIN
        PRINT 'USER ALREADY EXISTS'
        ROLLBACK
    END
ELSE
    BEGIN
        COMMIT TRANSACTION
    END

我执行如下:

exec logTRAN '0L036','aaa' //这是LogInID为'0L036'的重复记录

但是记录被插入,结果如下:

(1 row(s) affected)
USER ALREADY EXISTS
Msg 266, Level 16, State 2, Procedure logTRAN, Line 0
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 2, current count = 0.

我的存储过程中可能有什么错误?

请指导我。

【问题讨论】:

  • 您应该在插入语句中命名您的列。执行插入后用户将始终存在,因此始终会失败。 EXISTS 中不应包含 COUNT。要么返回计数并进行检查,要么使用* 作为您的列列表。
  • 我可能弄错了,但你应该在AS 之后有一个BEGIN,并以END 结束你的过程
  • @RobertMcKee 不,不一定。但第一条评论成功了。

标签: sql sql-server-2005 stored-procedures


【解决方案1】:

将您的 SP 更改为

CREATE PROCEDURE logTRAN
   @id   varchar(25),
   @pass varchar(25)
AS
IF EXISTS (SELECT 1 FROM login WHERE LogInID = @id)
    PRINT 'USER ALREADY EXISTS'
ELSE
    INSERT INTO login VALUES(@id, @pass)

这里是SQLFiddle演示

附带说明:恕我直言,您根本不需要 SP。这就是 UNIQUE 约束的用途。

【讨论】:

    【解决方案2】:

    如下更改您的查询:

    ALTER PROCEDURE logTRAN
    (
       @id   varchar(25),
       @pass varchar(25)
    )
    AS
    BEGIN
      IF EXISTS (SELECT LogInID from login where LogInID=@id)
      BEGIN
         PRINT 'User Already Exists'
      END
      ELSE
      BEGIN
         INSERT INTO login Values(@id,@pass)
      END
    END
    RETURN
    

    或者如果您不想打印,请使用:

    ALTER PROCEDURE logTRAN
    (
       @id   varchar(25),
       @pass varchar(25)
    )
    AS
    BEGIN
      IF NOT EXISTS (SELECT LogInID from login where LogInID=@id)
      BEGIN
         INSERT INTO login Values(@id,@pass)
      END
    END
    RETURN
    

    我建议使用彼得姆的答案。您应该使用 SELECT 1 代替 SELECT LogInID。

    【讨论】:

    • 你应该使用peterm的SELECT 1的方法,比我的好。
    • 理论上数据库甚至不必从表中检索 LogInID,实际上,因为它在存在语句中,所以无论如何它都应该被优化掉。
    • @Freelancer,实际上,您不需要选择任何列,因为您只需要检查 Id 是否存在。我在选择中使用了 ID,但它没有用。我也是新学习者,所以今天我通过彼得姆的回答从你的问题中学到了新东西。感谢他和你。
    • 实际上,您将使用什么并不重要,因为EXISTS 完全忽略了该部分。 1 更短,恕我直言更干净,但这只是个人喜好。
    猜你喜欢
    • 2016-10-04
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多