【问题标题】:Dynamically Created SQL Job With Query/Code使用查询/代码动态创建的 SQL 作业
【发布时间】:2020-06-27 05:05:11
【问题描述】:

我正在开发一个投标系统。

人们在出价时间开始和结束时出价。

是否可以使用查询创建 SQL 作业?

我想做的是,一旦投标时间结束, 我想更新每个投标人的记录,了解谁是赢家或输家。

所以,我的想法是,当管理员设置投标的开始日期和结束日期时,我想动态创建一个调度作业,该作业将自动运行存储过程,当日期为等于结束日期。

有可能吗?

我在想的另一种方法是,在投标页面上放置一个检查器,该检查器会不断检查数据库的投标时间,如果它检测到投标已经结束,它会自动执行一个更新每个用户记录的存储过程?我对这种方法感到害怕的是,如果许多用户正在访问该页面,许多用户现在会调用该存储过程。

非常感谢任何建议。

【问题讨论】:

  • 您可以对 SQL 代理作业中的过程执行动态运行。我不确定 SQL 代理的动态运行能力
  • 是的。可以使用 t-sql 创建 sql 作业。当管理员设置了投标的开始日期和结束日期时,为什么要创建计划作业。管理员设置出价日期时,是不是也可以执行存储过程?调度作业的目的是什么?
  • 感谢您的回复。 @Avi 如果我运行设置一个每秒运行的 sql 作业会很糟糕吗?它将检查投标结束日期时间?如果日期等于结束日期时间。它将调用存储过程。
  • 是的。这是坏的。你正在消耗资源。当管理员设置结束日期时,最好在同一进程中执行此操作
  • @Squirrel 感谢您的回复。我想要做的是,一旦投标时间结束,它会自动更新所有投标人记录。这就是为什么我计划动态创建调度作业的原因。对不起,如果它令人困惑

标签: sql sql-server


【解决方案1】:
  1. 在对象资源管理器中,连接到数据库引擎实例。

  2. 在标准栏上,单击新建查询。

  3. 将以下示例复制并粘贴到查询窗口中,然后单击执行。

--Create job
USE msdb ;  
GO  

EXEC dbo.sp_add_job  
    @job_name = N'Weekly Sales Data Backup' ;  
GO  
--Add schedule to your job
EXEC msdb.dbo.sp_add_jobschedule 
        @job_name = N'Weekly Sales Data Backup', -- Job name
        @name = N'Weekly_Sat_2AM',  -- Schedule name
        @freq_type = 8, -- Weekly
        @freq_interval = 64, -- Saturday
        @freq_recurrence_factor = 1, -- every week
        @active_start_time = 20000 -- 2:00 AM
-- creates a job step that uses Transact-SQL  
USE msdb;  
GO  
EXEC sp_add_jobstep  
    @job_name = N'Weekly Sales Data Backup',  
    @step_name = N'Set database to read only',  
    @subsystem = N'TSQL',  
    @command = N'ALTER DATABASE SALES SET READ_ONLY',   
    @retry_attempts = 5,  
    @retry_interval = 5 ;  
GO  

完整的sp_add_jobstep参数列表

sp_add_jobstep [ @job_id = ] job_id | [ @job_name = ] 'job_name'   
     [ , [ @step_id = ] step_id ]   
     { , [ @step_name = ] 'step_name' }   
     [ , [ @subsystem = ] 'subsystem' ]   
     [ , [ @command = ] 'command' ]   
     [ , [ @additional_parameters = ] 'parameters' ]   
          [ , [ @cmdexec_success_code = ] code ]   
     [ , [ @on_success_action = ] success_action ]   
          [ , [ @on_success_step_id = ] success_step_id ]   
          [ , [ @on_fail_action = ] fail_action ]   
          [ , [ @on_fail_step_id = ] fail_step_id ]   
     [ , [ @server = ] 'server' ]   
     [ , [ @database_name = ] 'database' ]   
     [ , [ @database_user_name = ] 'user' ]   
     [ , [ @retry_attempts = ] retry_attempts ]   
     [ , [ @retry_interval = ] retry_interval ]   
     [ , [ @os_run_priority = ] run_priority ]   
     [ , [ @output_file_name = ] 'file_name' ]   
     [ , [ @flags = ] flags ]   
     [ , { [ @proxy_id = ] proxy_id   
         | [ @proxy_name = ] 'proxy_name' } ]  

【讨论】:

  • 感谢这个脚本先生。我会试一试,但我突然意识到,没有必要的许可,这不能动态完成 -,-
【解决方案2】:

我认为,一旦投标时间结束,通知投标人的系统是更好的方法,原因如下:

  • 因为每次投标一次,而不是每次投标多次调用,并且不影响系统性能
  • 由于它是系统驱动的,用户不能尝试通过多次不必要的调用来使系统过载。

我不建议您从事动态工作。原因是:

  • 为每个投标创建一个动态作业,将使系统拥有大量作业且难以维护

  • 工作完成后,您需要有一个单独的内务脚本来清理工作

我建议使用频率非常短的静态工作

  • 即使您可以接受 30 秒的延迟,您甚至可以将作业安排为 30 秒的频率,这将查看过去 30 秒内完成的投标并向投标人发送更新。我不确定,如何才能减少。

Read more on job schedule frequency in SO post

【讨论】:

  • 感谢先生的回复。当您说系统通知投标人时,它是由管理员调用的吗?如果是,那可能有效。再次感谢先生
  • 是的。我的意思是调度静态作业将检查出价是否结束(到达结束时间)并通知用户(更新用户记录)。
  • 不客气。如果它回答了您的问题,请将其标记为答案。所以,这对未来的人们会有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多