我刚刚学习存储过程,遇到问题,请大家帮帮忙,谢谢了。
请问如何在存储过程中提取select查询结果到局部变量中,可以进行下一步更新操作。
因为我指定了top 1 仅仅返回一条记录,如果存在应该如何取出结果中的score这一列啊
set @score=score
这里提示列名'score'无效
还有就是在更新完毕以后,想要依然可以返回这个select的所有列的内容给客户端程序。
如果在存储过程中多次select,如何在外部访问这些查询出来的结果呢create procedure Calc
@studentID varchar(50)
as
declare @sql varchar(1024), @score integer
begin
set @sql='select top 1 * from studentInfo where id='+@studentID
exec sp_executesql @sql

if @@ROWCOUNT<>0
begin
set @score=score
if @score>90
begin
set @sql='update summary set score=score'+cast(@score as varchar)
exec sp_executesql @sql
end
end
end谢谢了

解决方案 »

  1.   

     if @@ROWCOUNT<>0
         begin
             set @score=score
             if @score>90
             begin    
                 set @sql='update summary set score=score'+cast(@score as varchar)
                 exec sp_executesql @sql
             end
         end
    红字部分要从某个表里面取或者显式指定值。不然SQLServer不知道你这个值是哪里来的
      

  2.   

        set @sql='select  * into #t from studentInfo where id='+@studentID
         exec sp_executesql @sql
    可以加上红字部分,来把结果集放到#t中,在存储过程的整个生命周期内都能用到
      

  3.   

    create procedure Calc
        @studentID varchar(50),
         @score output
    as
    declare @sql varchar(1024)
    begin
        set @sql='select top 1 * from studentInfo where id='+@studentID
        exec sp_executesql @sql
        
        if @@ROWCOUNT<>0
        begin
            set @score=score
            if @score>90
            begin    
                set @sql='update summary set score=score'+cast(@score as varchar)
                exec sp_executesql @sql
            end
        end
    end试试看,使用 storeproce的output参数可以传到客户端开发工具接受值的
      

  4.   

    create procedure Calc
         @studentID varchar(50)
     as
     declare @sql varchar(1024), @score integer
     begin
         set @sql='select top 1 * into #t from studentInfo where id='+@studentID
         exec sp_executesql @sql
         
         if @@ROWCOUNT<>0
         begin
             SELECT  @score=(SELECT score FROM #t)
             if @score>90
             begin    
                 set @sql='update summary set score=score'+cast(@score as varchar)
                 exec sp_executesql @sql
             end
         END
         
         SELECT * FROM summary
     end
    执行之后就会得到结果集
      

  5.   


    --你的写法类似这样,但不知道你想做什么,呵呵
    create procedure Calc
        @studentID varchar(50)
    as
    declare @sql varchar(1024), @score integer
    begin
    select top 1 @score=score from studentInfo where id=@studentID
    if @score>90
    update summary set score=@score;
    select * from summary;
    end
    go
      

  6.   

    使用临时表,完全可以查询出来了,太谢谢啦!!还想请教一下,在VC中,如何使用ADO访问这个存储过程返回的结果呢?
    因为存储过程,包括了查询和更新操作,应该使用_RecordsetPtr::Open呢,还是_CommandPt::Eecute呢我只需要得到这个临时表中的select出来的数据,先谢谢了
      

  7.   

    我的调用是这样的:CString sql;
    sql.Format("execute Calc '%d'", sid);
      

  8.   

    谢谢你,帮了大忙。也请大家懂得帮忙一下啊,是如何用ADO访问SQL Server的存储过程
      

  9.   

    自己解决了,根据需要设置 NOCOUNT on/off即可。谢谢大家