我想为登录表编写存储过程。
此过程涉及,检查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.
我的存储过程中可能出现什么错误?
请指导我。
答案 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。