SQL过程未按顺序工作
我想为登录表编写存储过程 这个过程包括,检查LogInID是否已经存在,如果它存在,则不允许插入具有相同LogInID的记录 一、程序如下: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)
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只是更短更干净,但这只是个人喜好。