0

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

此过程涉及检查 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'的重复记录

但是 Record 被插入,结果如下:

(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.

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

请指导我。

4

2 回答 2

3

将您的 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约束。

于 2013-05-29T06:09:27.150 回答
1

更改您的查询,如下所示:

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。

于 2013-05-29T06:09:19.420 回答