--创建测试环境
create table tupian
(
  id int,
  isdel bit,
  isshow bit
)
insert tupian
select 1,1,1 union
select 2,0,1 union
select 3,0,1 
gocreate  proc sp_test
@p int=10,
@pc int=0 output
as
declare @sql nvarchar(1000)
declare @pcc int
select @pcc=count(1) from tupian where isdel=0 and isshow=1
set @pc=@pcc
set @sql='select top '+cast(@p as nvarchar(20))+' id from tupian where isdel=0 and isshow=1'
exec(@sql)
return @pcc
go--测试
declare @n int,@count int,@returnValue int
select @n=5
exec @returnValue=sp_test @n,@count outputselect [返回值]=@returnValue,[输出参数]=@count--删除测试环境
drop table tupian
drop procedure sp_test--结果
/*
id          
----------- 
2
3(2 row(s) affected)返回值         输出参数        
----------- ----------- 
2           2(1 row(s) affected)
*/

解决方案 »

  1.   

    ---改为sp_executesql
    create  proc sp_test
    @p int=10,
    @pc int=0 output
    as
    declare @sql nvarchar(1000)
    declare @pcc int
    select @pcc=count(1) from tupian where isdel=0 and isshow=1
    set @pc=@pcc
    set @sql=N'select top '+cast(@p as nvarchar(20))+' id from tupian where isdel=0 and isshow=1'
    exec sp_executesql @sql
    return @pcc
    go
      

  2.   

    哦哟,我好像理解错了!楼主其实就是需要返回数据集合,那么不管用exec sp_executesql还是exec,都一样exec sp_test...都会返回数据集合,你上面如果用了output返回值就不用return,因为直接调用:
    declare @pc int
    exec sp_test 50,@ppc output
    select  @ppc --因为还是会返回数据集,那么在下面可以看到返回值已经存在了!如果用的是return,调用时候必须是:
    declare @pc int
    exec @ppc = sp_test 50 ----output指不指定没有关系
    select  @ppc
      

  3.   

    如果变量用了output,,就不需要用return来返回了!! 直接把return改成select
      

  4.   

    回复人: jinfeiyang(机会是给有充分准备的人) ( ) 信誉:100  2005-08-09 14:08:00  得分: 0  
     
     
       如果变量用了output,,就不需要用return来返回了!! 直接把return改成select
    --直接把return改成select??直接set @pc=@pcc,返回值本来就不需要在grid里面秀出来啊!  
     
      

  5.   

    恩,我是想结果集和 OUTPUT一起返回,
    这个SP是想测试是否RETURN 和 OUTPUT 是否都没返回
    但是发现在SQL查询分析器可以PRINT出东西但是在ASP中通过adodb.COMMAND的EXECUTE 之后。 就得不到返回了。 最后只好用 SELECT @PC 返回第二个结果集。 我还是想知道如果OUTPUT 或者 RETURN 的话该怎么办呢?