Sql server 我可以使用输出变量获取值吗?
我有一个存储过程,检查用户名是否存在,如果不存在,则将其插入到用户表中,然后获取同一用户名的userid。我试图使用一个输出变量来获取用户ID。我做错了吗Sql server 我可以使用输出变量获取值吗?,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个存储过程,检查用户名是否存在,如果不存在,则将其插入到用户表中,然后获取同一用户名的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
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
您可以使用out参数,但我总是像在C#中一样避免在SQL中使用out参数,原因与此相同 如果您有一个仅包含用户ID的结果集:
select @UserId;
然后将其展开,以包括其他内容:
select @UserId, @UserGuid;
没有太多麻烦
即使您需要返回状态(允许登录/锁定登录)和详细信息,也可以使用多个结果集:
select @Status;
select @UserId; //etc.
如果您没有参数,则必须更改过程的签名-如果您支持多个客户机调用它,这可能是一个问题
使用结果集对调用代码所做的唯一更改是从结果集中不断查找新列。您已将其关闭--在将列名替换为与“我的用户表”中的内容相匹配后,这对我很有用。(我想我把所有的东西都换回来了)
在您的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
我在@idn变量上指定了一个需要确认的大小。忽略大小默认值为30,这是有效的。当我在这里的时候,你可以在我的代码中看到,它并没有真正使用错误处理,只是打印语句。我可以使用try、catch或@error吗?这取决于您的其他代码在做什么。我不确定我会不会担心,因为你只是在做插入。如果插入/选择失败,我(个人)将在我的应用程序中处理它。