SQL Server存储过程 - 如果Count()语句

时间:2013-12-26 15:58:39

标签: sql sql-server

我正在为SQL Server编写存储过程。我有一个工作版本,但我希望尽可能优化它,以便我不需要浪费两次调用数据库。

这是我的版本:

If Exists (Select * From webapi.dbo.Users Where Username=@Username)
Begin
    Select * From webapi.dbo.Users Where Username=@Username
End
Else
Begin
    Set @error_message = 'Username ' + @Username + ' does not exist.'
    Raiserror (@error_message, 16, 1)
End

我想要类似的东西:

Set @User = (Select * From webapi.dbo.Users Where Username=@Username)
If Count(@User) =
    Begin
        Set @error_message = 'Username ' + @Username + ' does not exist.'
        Raiserror (@error_message, 16, 1)
    End
Else
    Begin
        return @User
    End

这可能或聪明吗?我清楚地做了两个相同的调用,并希望删除其中一个,以便创建最快的系统和我自己的SQL知识。

我结束使用:

Select * From webapi.dbo.Users Where Username=@Username
If @@ROWCOUNT = 0
    Begin
        Set @error_message = 'Username ' + @Username + ' does not exist.'
        Raiserror (@error_message, 16, 1)       
    End

4 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

declare @Username varchar(50) = 'johnny'

if not exists (select 1 from users where username = @username) 
raiserror ('%s does not exist',16,1,@username)

T-SQL示例

答案 1 :(得分:0)

不完全是你想要的,但不如你的优化:

 If Exists (Select 1 From webapi.dbo.Users Where Username=@Username)
    Begin
        Set @error_message = 'Username ' + @Username + ' does not exist.'
        Raiserror (@error_message, 16, 1)
    End
Else
    Begin
        Select * From webapi.dbo.Users Where Username=@Username
    End

您可以使用简单的1来检查条件,而不是使用*

答案 2 :(得分:0)

您无法将选择结果存储在经典变量中,因为它是行,而不是字段。

如果您只需要获得1个字段,那么您可以使用@@ROWCOUNT执行您的操作:

DECLARE @var INT; 

SELECT @var = id FROM tableName WHERE condition...;

在此之后选择@@ROWCOUNT

IF @@ROWCOUNT = 0 BEGIN 
RAISERROR... 
END

答案 3 :(得分:0)

如果你担心你的往返旅行,你怎么会在数据库中“raiserror”。只需点击UserId或UserName

的数据库即可
select @userid = userid from users where username = @username

如果该变量返回null,则只在应用程序层引发该错误....

我实际上不确定你对数据库的“两次调用”是什么意思。您决定使用的解决方案使用“两个调用”。我觉得这里有点混乱。在您对“呼叫”的定义中,您的“if @@ rowcount”将被视为呼叫。

为什么不

if not exists (select * from user where username = @username)
  raiserror('no user',16,1)