SQL过程不按顺序工作

时间:2013-05-29 06:00:54

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

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

此过程涉及,检查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.

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

请指导我。

2 个答案:

答案 0 :(得分: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约束的含义。

答案 1 :(得分: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

我建议使用peterm的答案。您应该使用SELECT 1取代SELECT LogInID。