存储过程如下,为管理员登录判断(用户名与密码是否正确,且要返回特定列)set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[YmAdmin_Check]
(
@LoginName Varchar(10) ,
@LoginPassword char(32),
@Result_Str bit output
)
as
if exists(select @Result_Str=IsSystemAdmin   from Ymadmin where LoginName=@LoginName  and LoginPassword=@LoginPassword)
return 
如果只用select IsSystemAdmin   from Ymadmin where LoginName=@LoginName  and  LoginPassword=@LoginPassword 查到满足条件的记录却仍然继续,感觉数量记录多时有点不太好!
想用top 1,但看了查询分析器的执行计划,是先扫描完表再返回1条记录,似乎也不符合要求于是打算用if exists一满足立即返回,可问题是我还要得到IsSystemAdmin的值。
结果提示:'=' 附近有语法错误。
谢谢!

解决方案 »

  1.   

    ALTER PROCEDURE [dbo].[YmAdmin_Check]
    (
    @LoginName Varchar(10) ,
    @LoginPassword char(32),
    @Result_Str bit output
    )
    as
    select top 1 @Result_Str=IsSystemAdmin from Ymadmin where LoginName=@LoginName and LoginPassword=@LoginPassword
    return
      

  2.   

    可是我看那个查询分析器是查先完表再select top 1的,例如原表有500条记录,好像是查完500条然后再显示top 1条的,而不是先根据top N来确定待检索记录数~
    是不是我对查询分析器的执行计划的图表理解错了。谢谢!
      

  3.   

    可那个执行计划好像是先 select 所有满足条件的记录,然后再显示top 的,而不是
    while i<top N
    {
    select 满足条件的记录;
    i++;
    }不知用top1有效果吗?
      

  4.   

    那你看下不用TOP 1 执行时间多少,比较一下
      

  5.   

    当然有效果:你没看到“前几行”这个操作吗,SQL不会傻到所有行都取出来,再 TOP 1