2015-12-01 2 views
0

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

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

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

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

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

+2

Возможно, это обновление в отдельной работе, которая работает только один раз в день? – GolezTrol

+0

почему вы выбираете 4 утра, а не 00.01? что должно произойти, если расписание будет перенесено на 3 часа? должен ли код sql быть изменен для соответствия? пожалуйста, объясните это требование, а не решение, которое вы пытаетесь установить на место ... – Paolo

+0

@Paolo Я добавил свое требование на вопрос –

ответ

0

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