Определите, выполняется ли задание сегодня впервые
Каждый день при первом запуске задания 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