异步调用存储

来源:转载

 起源

因为项目中,需要用到存储过程进行大量的计算,存储过程执行的速度让人感觉揪心,不能说让客户在页面上待个几分钟吧,因此就想,有没有一种方法,可以做到客户发出请求,然后数据库在后台执行任务,于是.......

具体方法

经过百度知道,作业可以在后台自动执行一段存储过程,所以,通过动态生成作业,然后作业再调用存储过程就好了,动态生成作业就需要到存储过程的帮助,通过设置好一些参数后,生成一个临时作业,然后设置作业立即执行就可以了,下面是生成动态作业的代码,这个存储过程是在网上找的,但是自己也有改过一些代码,满足我们自己的项目需求

 1 set ANSI_NULLS ON 2 set QUOTED_IDENTIFIER ON 3 GO 4 /****************************************************************************** 5 * 在SQL SERVER 中创建用于执行异步调用的临时Job 6 * @EXECSQL: 填写要执行的存储过程的名称,或者是sql语句 7 ******************************************************************************/ 8 ALTER Procedure [dbo].[AsyRunPro] 9 @EXECSQL nvarchar(4000)='EXEC dbo.BatchRatingAsy ',10 @job nvarchar(50)='JL_AsynchronousInvoking',11 @servern nvarchar(50)=N'(local)' ,12 @dbname nvarchar(50)=''--下面会通过db_name()函数获取13 AS14 15 BEGIN TRANSACTION16 DECLARE @JobID BINARY(16)17 DECLARE @ReturnCode INT18 SELECT @ReturnCode = 019 20 BEGIN21 SET @dbname=CONVERT(NVARCHAR(50),db_name())22 --SELECT @dbname 23 -- Add the job24 EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,25 @job_name = @job,26 @owner_login_name = N'',27 @description = N'AsynchronousInvokingRating', -- the description of the job28 @category_name = N'[Uncategorized (Local)]', 29 @enabled = 1,30 @notify_level_email = 0,31 @notify_level_page = 0,32 @notify_level_netsend = 0,33 @notify_level_eventlog = 0,34 @delete_level= 335 36 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback37 38 -- Add the job steps39 EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,40 @step_id = 1,41 @step_name = N'step1',42 @command = @EXECSQL, -- sql batch43 @database_name = @dbname, --作业所操作的数据库的名字44 @server = N'',45 @database_user_name = N'',46 @subsystem = N'TSQL',47 @cmdexec_success_code = 0,48 @flags = 0,49 @retry_attempts = 0, --只是执行一次50 @retry_interval = 0,51 @output_file_name = N'',52 @on_success_step_id = 0,53 @on_success_action = 1, -- 成功则删除54 @on_fail_step_id = 0,55 @on_fail_action = 2 -- on fail abort56 --select @JobID57 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback58 59 --set the star step id of the job60 EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID,61 @start_step_id = 162 63 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback64 65 -- Add the Target Servers66 EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID,67 @server_name = @servern--传入的服务器名称68 69 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback70 71 END72 73 COMMIT TRANSACTION74 GOTO EndSave75 76 QuitWithRollback:77 IF (@@TRANCOUNT > 0) BEGIN78 ROLLBACK TRANSACTION79 RETURN 180 END81 EndSave:82 83 --立刻开启作业84 EXEC @ReturnCode = msdb.dbo.sp_start_job @job_id = @JobID85 86 --返回响应调用者87 RETURN @ReturnCode


分享给朋友:
您可能感兴趣的文章:
随机阅读: