我有一个存储过程,我正在检查用户名是否存在,如果不存在,请插入用户表,然后获取相同用户名的userid。我试图使用输出变量来获取用户ID。我是不是错了?
alter Procedure Check_User_Name
(
@username varchar(25),
@password varchar(100),
@role_id integer,
@idn nvarchar output
)
As
Begin
IF NOT EXISTS(SELECT idn=@idn
FROM [user] WHERE username = @username)
BEGIN
INSERT INTO [user] (username,[password],role_id) VALUES
(@username, @password,@role_id)
--select @idn=idn from [user]
Print 'UserName inserted successfully'
End
Else IF EXISTS(SELECT * FROM [user] WHERE username = @username)
Begin
Print 'UserName already exists'
End
END
答案 0 :(得分:1)
你把它关闭了 - 在更换你的列名以匹配我的用户表中的内容之后,这对我有用。 (我想我已经取代了所有东西)。
在你的Else
上,你基本上是按用户名进行第二次查询 - 在这种情况下这是不必要的。
ALTER Procedure Check_User_Name
(
@username varchar(25),
@password varchar(100),
@role_id integer,
@idn nvarchar(20) output
)
As
Begin
IF NOT EXISTS(SELECT idn
FROM [user] WHERE username = @username)
BEGIN
INSERT INTO [user] (username,[password], role_id) VALUES
(@username, @password)
select @idn=idn from [user] WHERE username = @username
Print 'UserName inserted successfully'
End
Else
Begin
Print 'UserName already exists'
SELECT @idn = idn FROM [user]
WHERE username = @username
End
END
GO
执行:
DECLARE @idnOut nVarChar(20)
exec Check_User_Name @username = 'user2127184', @password = 'asdf', @role_id = 0, @idn = @idnOut OUTPUT
SELECT @idnOut
答案 1 :(得分:0)
你可以使用params,但是我总是避免使用SQL中的params,就像我在C#中一样,出于同样的原因。
如果您的结果集仅包含UserId:
select @UserId;
然后你将它展开以包含其他内容:
select @UserId, @UserGuid;
没有太多麻烦。
即使您需要返回状态(登录允许/锁定)和详细信息,您也可以使用多个结果集:
select @Status;
select @UserId; //etc.
如果您有参数,则必须更改过程的签名 - 如果您支持多个客户端调用它,则可能会出现问题。
您需要对结果集的调用代码进行的唯一更改是继续从结果集中查找新列。