Sql server 我可以使用输出变量获取值吗?

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

我有一个存储过程,检查用户名是否存在,如果不存在,则将其插入到用户表中,然后获取同一用户名的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

您可以使用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吗?这取决于您的其他代码在做什么。我不确定我会不会担心,因为你只是在做插入。如果插入/选择失败,我(个人)将在我的应用程序中处理它。