Определите, выполняется ли задание сегодня впервые

Каждый день при первом запуске задания sql мне нужно обновлять некоторые столбцы. Моя работа начнется в 4 утра каждый день.

так что я могу сделать это:

IF(CONVERT(VARCHAR(8),GETDATE(),108) = '04:00:00')
BEGIN
 // Update
END

Но, если по какой-то причине моя работа не могла работать в 4 утра. Как я могу сбросить эти столбцы. Любая идея, предложение, помощь.

Мое требование следующее: моя система получает задания от моих конечных пользователей. Эта работа должна назначать эти задачи сотрудникам в зависимости от их возможностей. Итак, у меня есть таблица со столбцом EmpId, MaxAssignments(максимальное количество задач может быть назначено за день) и AssignmentsCount(количество назначенных задач). Каждый день при первом запуске я хочу установить значение "AssignmentsCount" в 0.

1 ответ

Вы должны быть в состоянии использовать код, подобный тому, который показан ниже на вашем шаге работы. Операторы SQL разбиты на части с комментариями для объяснения. Для краткости вы можете объединить их или даже превратить в отдельную скалярную функцию, которая принимает идентификатор задания и возвращает true или false, если это первый запуск.

DECLARE @job_id uniqueidentifier
DECLARE @run_requested_date DATETIME
DECLARE @first_run_today DATETIME

-- Use Tokens in Job Steps
-- https://msdn.microsoft.com/en-us/library/ms175575.aspx
-- Within your SQL Agent job step you can use this tokenized
-- statement to get the job_id.
--SET @job_id = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID)))

-- You can use this statement instead, but it will break if the
-- job name is changed and you forget to update the [name]
-- parameter below ('Test' is the job name in this example)
SELECT @job_id = job_id
  FROM msdb.dbo.sysjobs
 WHERE name = 'Test'

-- Debug statement
PRINT 'job_id = ' + CONVERT(VARCHAR(255), @job_id)

-- Get the scheduled run time for this currently
-- executing job (can alternatively use the
-- start_execution_date column instead)
SELECT @run_requested_date = run_requested_date 
  FROM msdb.dbo.sysjobactivity 
 WHERE job_id = @job_id

-- Debug statement
PRINT 'run_requested_date = ' + CONVERT(VARCHAR(50), @run_requested_date, 126)

-- For the given job, find any job history row that
-- was successfully execute at an earlier time on 
-- this date.
--
-- The msdb.dbo.agent_datetime() function is a built-in
-- function that will values from the separate date and time
-- columns in the job history table and convert them to a
-- single datetime value.
SELECT @first_run_today = msdb.dbo.agent_datetime(run_date, run_time) 
  FROM msdb.dbo.sysjobhistory 
 WHERE JOB_ID = @job_id 
   AND run_status = 1 -- Successful
   AND run_date = CONVERT(VARCHAR(10), @run_requested_date, 112) -- YYYYMMDD format compare
   AND msdb.dbo.agent_datetime(run_date, run_time) < @run_requested_date

-- Debug statement
PRINT 'first_run_today = ' + CONVERT(VARCHAR(50), @first_run_today, 126)

-- If the first_run_today variable is null then
-- that means for the current date we did not
-- any successful runs of this job before now.
IF @first_run_today IS NULL
BEGIN
  PRINT 'This *is* the first run.'
  -- First run statements go here.
END
ELSE
BEGIN
  PRINT 'This is *not* the first run.'
  -- Non first run statements go here.
END
Другие вопросы по тегам