我正在为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
答案 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)