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

怎么样才能实现 一个存储过程调用另外一个存储过程
存储过程中的代码如下:
create proc SP_testMAOSB
(
 @where nvarchar(max)='-1'
)
as 
create table #a
(
machine nvarchar(500) null,
 DURATION nvarchar(500) null
)
declare @sql nvarchar(max)
set @sql='insert into #a(machine,DURATION) '
 set @sql=@sql+' SELECT   
        (dbo.T_SFC_DOWNTIME_CODE.DOWNTIME_CODE_NUMBER + ''—'' + ISNULL(dbo.T_SFC_DOWNTIME_CODE.DOWNTIME_CODE_NAME, '''')) AS ''machine'', 
        cast (SUM(dbo.T_SFC_DT_PER_MACHINE_DATA.DURATION) AS varchar(100))  AS ''DURATION''                     
  
  FROM       dbo.T_SFC_DOWNTIME_CODE INNER JOIN dbo.T_SFC_DT_PER_MACHINE_DATA ON 
             dbo.T_SFC_DOWNTIME_CODE.DOWNTIME_CODE_ID = dbo.T_SFC_DT_PER_MACHINE_DATA.DOWNTIME_CODE_ID INNER JOIN
             dbo.T_SFC_MACHINE_DATA ON 
             dbo.T_SFC_DT_PER_MACHINE_DATA.MACHINE_DATA_ID = dbo.T_SFC_MACHINE_DATA.MACHINE_DATA_ID INNER JOIN
             dbo.T_SFC_MACHINE ON dbo.T_SFC_MACHINE_DATA.MACHINE_ID = dbo.T_SFC_MACHINE.MACHINE_ID '
   if(@where<>'-1')
begin 
   set @sql=@sql+' '+@where; 
end
set @sql=@sql+' group by (dbo.T_SFC_DOWNTIME_CODE.DOWNTIME_CODE_NUMBER + ''—'' + ISNULL(dbo.T_SFC_DOWNTIME_CODE.DOWNTIME_CODE_NAME, ''''))';     
print (@sql)
exec(@sql)


该存储过程在VS里面有参数的传递

SP_testMAOSB '"+str+"'

string str=" where     dbo.T_SFC_DT_PER_MACHINE_DATA.START_TIME  between'" +dt1 + "' and '" + dt2+ " ' ";
            if ( nu != "")
            {
                str += " and dbo.T_SFC_MACHINE.MACHINE_NUMBER='" +nu + "'  ";
}
存储过程反馈出来的是一段SQL语句。现在希望能够通过调用这个存储过程,执行其SQL语句
并通过 select machine, DURATION from #a 
查询数据并反馈到VS中!  求教育   求解决!!!
------解决方案--------------------
你新建一个存储过程,在VS中调用就好。
#a是临时表,你可以在session终止之前,随时调用这个表的。表变量就不行。
------解决方案--------------------
我想说:
最好把临时表的声明也放到拼接语句里面 
这样可以保证临时表的声明周期和拼接语句的生命周期相同
另外 临时表只限在本次存储执行过程中存在
也就意味着 select machine, DURATION from #a需要放到存储过程的末尾执行
这样 存储过程最终返回一个数据集而不是字符串