日期:2014-05-17  浏览次数:20880 次

怎样是调用的存储过程执行,但是不显示执行结果
在存储过程中有这样的代码,如下这样

EXEC [FMS].[usp_FMS_Report_SalesReport]
@ProfileHierarchyId = @ProfileHierarchyId,
@FranchisingHierarchyId = @FranchisingHierarchyId,
@Year=@Year,
@Month=@Month,
@EndYear=@EndYear,
@EndMonth=@EndMonth


这样的代码不止一处,就是我需要调用其他的存储过程
但是这样带来一个问题,这些存储过程有的最后是有select *   这样的语句
这样我这个存储过程就会输出多个表格
实际上我需要的知识最后一个。
怎样能使这些调用的存储过程执行,但是不要显示执行的结果?
比如调用的[FMS].[usp_FMS_Report_SalesReport]
本身也可能调用了其他存储过程,建个临时表接收数据是不行的

难道就自能把这些代码再重复写一次?

------解决方案--------------------
存储过程里没输出?
------解决方案--------------------
假设你的存储过程名字为A,再假设没有参数,返回结果为一列name,那么可以用:

create table #tb (name nvarchar(128))

insert into tb
exec a

把这部分改善一下,再放到存储过程里面,这样你就可以用到这些结果,但是除非最外层的存储过程返回数据,否则整个存储过程都不会返回数据。
------解决方案--------------------
其实不是不允许,只是是多个会话,导致临时表无效,可以用全局临时表,但是在并发的时候就容易出问题,所以你可能要考虑换中方式,比如用函数,或者把逻辑写到里面,减少嵌套层次
------解决方案--------------------
显示结果怕什么,最终不还是由程序调用来取你要的结果吗?难道你只是在查询分析器里执行给用户看?
如果真的要最后一个存储过程的结果那就只有改写被调用的过程了
------解决方案--------------------
用Return 结尾
------解决方案--------------------
如果是这样,可以把存储过程变通一下:
比如在每个存储过程中加一个标志变量@Flag bit

在你的存储过程中select 结果这前加一个判断
if @Flag=1
  set noexec on
select * from ....
set noexec off 

这样,调用的时候就可以用@Flag为1和0来控制显不显示结果