存储过程先返回结果,再后台执行

飞猫0213 2013-12-09 01:59:16
我有个存储过程,执行时间可能要很久。我不想一直等下去,有没有办法,先返回结果给客户端。
我考虑过,客户端调用存储过程A建立作业,启动作业。然后这个作业去执行存储过程B。
B就是我们那个执行时间比较久的存储过程。

不知道这样能实现吗?或者有什么其他的方法?
...全文
172 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
飞啊子 2013-12-09
这种方案是最好的。 楼主,你为什么还要存储过程中建作业?
引用 5 楼 dotnetstudio 的回复:
那你还不如建立一个中间表,用一个作业定期处理数据存放到中间表,存储过程读取中间表的数据,这些就快多了
回复
引用 8 楼 feimao784830900 的回复:
[quote=引用 7 楼 feimao784830900 的回复:] [quote=引用 6 楼 yupeigu 的回复:] [quote=引用 4 楼 tcmakebest 的回复:] 如果存储过程B执行是否成功不重要,可以这么做
应该是可以的[/quote] 该存储过程很多统计,按天,按周,按月对历史表统计,举例用户要查出销量每天>1000 、盈利>1000 ...可能是有十多个统计参数。反正传多一个参数过来,就是多一个统计类型。所以才时间长点。 存储过程能建立作业?还能启动它吗?应该怎么弄呢?[/quote] 可以允许时间统计长点,没有关系的。这个客户不要求速度的[/quote] 可以在你的存储过程中写下面的代码:




--1.新建作业 --> 作业步骤 --> 作业调度 --> 作业服务器
declare @jobname sysname,@db_name sysname


select @jobname = 'job_update_sql',
       @db_name = db_name()


--1.1创建作业
exec msdb..sp_add_job 
	@job_name=@jobname


--1.2创建作业步骤
exec msdb..sp_add_jobstep 
	@job_name=@jobname,
	@step_name = N'数据处理',
    @subsystem = N'TSQL',
    @database_name=@db_name,
    @command = N'Exec 你的存储过程',  
    @retry_attempts = 1, 
    @retry_interval = 1  


--1.3添加作业步骤,每天8点运行一次
EXEC msdb..sp_add_jobschedule 
	@job_name=@jobname, 
    @name = N'job_update_sql作业运行时间',
    @freq_type=4 ,    --间隔为每天
    @freq_interval=1,
	@active_start_time=200000  --8点


--1.4添加目标服务器
EXEC msdb.dbo.sp_add_jobserver 
	@job_name = @jobname ,  
	@server_name = @@servername --@@servername 这个函数的返回值不一定准确 
回复
飞猫0213 2013-12-09
引用 7 楼 feimao784830900 的回复:
[quote=引用 6 楼 yupeigu 的回复:] [quote=引用 4 楼 tcmakebest 的回复:] 如果存储过程B执行是否成功不重要,可以这么做
应该是可以的[/quote] 该存储过程很多统计,按天,按周,按月对历史表统计,举例用户要查出销量每天>1000 、盈利>1000 ...可能是有十多个统计参数。反正传多一个参数过来,就是多一个统计类型。所以才时间长点。 存储过程能建立作业?还能启动它吗?应该怎么弄呢?[/quote] 可以允许时间统计长点,没有关系的。这个客户不要求速度的
回复
飞猫0213 2013-12-09
引用 6 楼 yupeigu 的回复:
[quote=引用 4 楼 tcmakebest 的回复:] 如果存储过程B执行是否成功不重要,可以这么做
应该是可以的[/quote] 该存储过程很多统计,按天,按周,按月对历史表统计,举例用户要查出销量每天>1000 、盈利>1000 ...可能是有十多个统计参数。反正传多一个参数过来,就是多一个统计类型。所以才时间长点。 存储过程能建立作业?还能启动它吗?应该怎么弄呢?
回复
引用 4 楼 tcmakebest 的回复:
如果存储过程B执行是否成功不重要,可以这么做
应该是可以的
回复
KeepSayingNo 2013-12-09
那你还不如建立一个中间表,用一个作业定期处理数据存放到中间表,存储过程读取中间表的数据,这些就快多了
回复
tcmakebest 2013-12-09
如果存储过程B执行是否成功不重要,可以这么做
回复
發糞塗牆 2013-12-09
分批执行可能是个好办法
回复
我觉得还是想办法,把这个执行时间很长的存储过程分析一下,看能不能优化,执行的更快。
回复
發糞塗牆 2013-12-09
不可行,事务需要有原子性,你这样万一中途出现问题,数据就容易出现不一致的情况,你的重点应该是优化存储过程,如果实在不可优化,应该设计应用程序有一定的响应,或者告知客户实际情况。存储过程不执行完,你怎么返回数据呢?
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2013-12-09 01:59
社区公告
暂无公告