SQL过程未按顺序工作

SQL过程未按顺序工作,sql,sql-server-2005,stored-procedures,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)

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

这个过程包括,检查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
我的执行如下:

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.
我的存储过程中可能有什么错误


请为我提供指导。

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

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。

更改查询,如下所示:

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。

将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)
这里是演示

附带说明:我想你根本不需要SP。这是唯一的约束。

将您的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)
这里是演示


附带说明:我想你根本不需要SP。这就是唯一约束的作用。

您应该在insert语句中命名列。在您执行插入操作后,用户将始终存在,因此插入操作将始终失败。您不应该在
存在
中有
计数
。返回计数并对照它进行检查,或者使用
*
作为列列表。我可能弄错了,但是您应该在
as
之后有一个
开始
,并以
结束
@RobertMcKee nope结束您的进程,不一定。但是第一条注释成功了。您应该在insert语句中命名您的列。在您执行插入操作后,用户将始终存在,因此插入操作将始终失败。您不应该在
存在
中有
计数
。返回计数并对照它进行检查,或者使用
*
作为列列表。我可能弄错了,但是您应该在
as
之后有一个
开始
,并以
结束
@RobertMcKee nope结束您的进程,不一定。但第一条评论成功了。你应该使用peterm的选择1的方法。它比我的要好。理论上,数据库甚至不必从表中检索LogInID,实际上,因为它在exists语句中,它应该得到优化。@自由职业者,实际上,你不需要在select中使用任何列,因为你只需要检查Id是否存在。我在select中使用了Id,但它没有任何用处。我也是一个新的学习者,所以今天我通过彼得的回答从你的问题中学到了新的东西。也感谢他和你。实际上你用什么并不重要,因为
存在
完全忽略了这一部分<代码>1只是更短更干净,但这只是个人喜好。你应该使用peterm的方法选择1。它比我的要好。理论上,数据库甚至不必从表中检索LogInID,实际上,因为它在exists语句中,它应该得到优化。@自由职业者,实际上,你不需要在select中使用任何列,因为你只需要检查Id是否存在。我在select中使用了Id,但它没有任何用处。我也是一个新的学习者,所以今天我通过彼得的回答从你的问题中学到了新的东西。也感谢他和你。实际上你用什么并不重要,因为
存在
完全忽略了这一部分<代码>1只是更短更干净,但这只是个人喜好。