2011-01-13 23 views
0

我想创建一个存储的过程,当用户的名字输入正确时返回用户的ID。基于返回的ID,我希望我的IF关系返回一个唯一的数字来告诉我用户是否存在于数据库中。我希望这是有道理的。谢谢。创建存储过程与参数,返回值

ALTER PROC dbo.PassParamUserID 
    @UserID int 
AS 

DECLARE @FirstName varchar(50) 

set nocount on 

SELECT f_Name 
FROM tb_User 
WHERE tb_User.f_Name = @FirstName; 

BEGIN 
    IF @UserID is not null 
    RETURN 222 
    ELSE 
    RETURN 333; 
    SET NOCOUNT OFF; 

END 
+0

什么似乎是你的代码的问题? – Oded 2011-01-13 13:12:02

+0

如果输入的用户标识不存在于数据库中,它仍会回退222而不是333.我已经很长时间了。 – jpavlov 2011-01-13 13:18:17

+0

为什么当它从未设置为值时查询@FirstName? – 2011-01-13 13:28:36

回答

1

如果我理解正确的话,你检查,如果在表中存在的名字,如果确实如此,则返回ID为姓..如果不存在的话,那么你想要的程序返回告诉你一个代码,标识缺失

在这种情况下,你想@FirstName进来作为一个参数和@UserId变量被从匹配的行选择在数据库

ALTER PROC dbo.PassParamUserID 
    @FirstName varchar(50) 
AS 

    set nocount on 

    DECLARE @UserId INT 

    SELECT @UserID = UserId 
    FROM tb_User 
    WHERE tb_User.f_Name = @FirstName 


    IF @UserID IS NULL 
    BEGIN 
     SET @UserId = -999 
    END 

    SELECT @UserId 

GO 

可能检查涉及两个fi的匹配是一个更好的主意姓和名。另外,如果姓名存在多次,你会怎么做?使用SET ROWCOUNT 1如果我理解正确的话你把这个

ALTER PROC dbo.PassParamUserID 
    @FirstName varchar(50), 
    @LastName varchar(50) 
AS 

    set nocount on 

    DECLARE @UserId INT 

    SET ROWCOUNT 1 

    SELECT @UserID = UserId 
    FROM tb_User 
    WHERE tb_User.f_Name = @FirstName 
    AND tb_User.l_Name = @LastName 

    SET ROWCOUNT 0 

    IF @UserID IS NULL 
    BEGIN 
     SET @UserId = -999 
    END 

    SELECT @UserId 

GO 
0

护理使用有点out参数

create procedure GetUserExists 
    @FirstName varchar(50), 
    @Ret bit out 
as 
if exists(select * 
      from tb_User 
      where tb_User.FirstName = @FirstName) 
    set @Ret = 1       
else 
    set @Ret = 0 
0

,这个选择查询可能工作:

SELECT CASE WHEN EXISTS(SELECT TOP 1 1 FROM tb_User WHERE tb_User.f_Name = @FirstName)THEN 1 ELSE 0 END

如果用户存在则返回1,否则返回0。它应该更好地执行,因为使用顶部1(即不需要扫描超过1行的存在)。