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

时间:2015-11-06 21:10:23

标签: 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 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

2 个答案:

答案 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.

如果您有参数,则必须更改过程的签名 - 如果您支持多个客户端调用它,则可能会出现问题。

您需要对结果集的调用代码进行的唯一更改是继续从结果集中查找新列。