JOB Обновлять поле на основании другого поля DateTime

Я реализую job в sql server.

Я верю во временную пластину, где я размещаю данные о моей первоначальной пластине. Здесь весь OK

Непрерывный рассказ данные, которые есть у моей временной пластины, и я реализую while, чтобы пробегать мою временную пластину, чтобы получать количество линий, которые у Вас есть. Здесь весь OK

Следуемый этим я реализую select во временную пластину и получаю дату, чтобы сравнивать ее с датой сервера используя GETDATE () внутри IF.

Здесь мой query начиная с While:

 DECLARE @count INT;
 DECLARE @fch2  DATETIME;
 SELECT @count = COUNT(*) FROM #Suple;/*cuento filas de tabla temporal*/
 WHILE @count > 0
 BEGIN
 SELECT  @fch2 = FCH_FIN FROM #Suple WHERE ACTIVO = 1 and Convert(Date,FCH_FIN) = CONVERT(date, GETDATE());/*obtengo las fechas del dia*/
 IF (GETDATE() = @fch2)/*comparo las fechas*/
 UPDATE TableOriginal SET ACTIVO = 0/*actulizo mi tabla original si es igua*/
 DELETE TOP(1) FROM #Suple /*borro la primer fila recorrida de temporal*/
 SET @count = (SELECT COUNT(*) FROM #Suple);/*vuelvo a contar las filas de temporal*/

 END
 DROP TABLE #Suple/*al finalizar borro temporal*/

Это поля моей Первоначальной и такой пластины каков перемещают Вас в #Suple, что является временной пластиной:
introducir la descripción de la imagen aquí

job запрограммирован для того, чтобы Вы были выполнены каждый час (7:00 AM - 19:00 PM) с понедельника по пятницу, но меня не обновляет поле, которое я хочу в час, который выполняется.

Этот пример я это поместил в 11:15 AM, я добавляю две записи Оригинала к Ненастью и Вы были должны обновлять линию, но я перемещаю время и не обновляю мое поле :(

introducir la descripción de la imagen aquí

Если Вы можете поддерживать меня, чтобы это решать...

ИЗДАННЫЙ определение Джоба

USE [msdb]
GO

 /****** Object:  Job [Suplentes]    Script Date: 11/08/2019 13:32:54 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]]    Script Date: 
11/08/2019 13:32:54 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE 
name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', 
@name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Suplentes', 
    @enabled=1, 
    @notify_level_eventlog=0, 
    @notify_level_email=0, 
    @notify_level_netsend=0, 
    @notify_level_page=0, 
    @delete_level=0, 
    @description=N'Habilitar y deshabilitar los suplentes.', 
    @category_name=N'[Uncategorized (Local)]', 
    @owner_login_name=N'NA\user', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [VerificaTiempos]    Script Date: 11/08/2019 13:32:54 
******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, 
@step_name=N'VerificaTiempos', 
    @step_id=1, 
    @cmdexec_success_code=0, 
    @on_success_action=1, 
    @on_success_step_id=0, 
    @on_fail_action=2, 
    @on_fail_step_id=0, 
    @retry_attempts=0, 
    @retry_interval=0, 
    @os_run_priority=0, @subsystem=N'TSQL', 
    @command=N'DECLARE @count INT;
DECLARE @fch2  DATETIME;
CREATE table #Suple(
ACTIVO NCHAR(10) not null,
FCH_INICIO DATETIME not null,
FCH_FIN DATETIME not null
);
INSERT INTO #Suple SELECT * FROM  Original where ACTIVO = 1 and 
Convert(Date,FCH_FIN) = CONVERT(date, GETDATE());

SELECT @count = COUNT(*) FROM #Suple;
WHILE @count > 0
BEGIN
SELECT  @fch2 = FCH_FIN FROM #Suple WHERE ACTIVO = 1 and Convert(Date,FCH_FIN) = CONVERT(date, GETDATE());
IF (GETDATE() = @fch2)
UPDATE Original SET ACTIVO = 0
DELETE TOP(1) FROM #Suple
SET @count = (SELECT COUNT(*) FROM #Suple);

END
DROP TABLE #Suple', 
    @database_name=N'database', 
    @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, 
@name=N'JobSche1', 
    @enabled=1, 
    @freq_type=8, 
    @freq_interval=62, 
    @freq_subday_type=1, 
    @freq_subday_interval=1, 
    @freq_relative_interval=0, 
    @freq_recurrence_factor=1, 
    @active_start_date=20191105, 
    @active_end_date=99991231, 
    @active_start_time=111500, 
    @active_end_time=235959, 
    @schedule_uid=N'ae0af8c4-c8dd-4027-964c-601e684481aa'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name 
= N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO

0
задан 08.11.2019, 21:41
1 ответ

Она definiciГіn job она правильна (имея в виду, что ocultГі имя login, базы данных и таблицы). cГіdigo возможно упрощать с простым UPDATE, который делает то, в чем ты нуждаешься, у себя не требует, чтобы пойти линия из-за линии.

    /*actualizo mi tabla original si es igual*/
    UPDATE T
    SET ACTIVO = 0
    FROM TABLEORIGINAL T
    WHERE ACTIVO = 1 
    AND CONVERT(DATE,FCH_FIN) = CONVERT(DATE, GETDATE());

Используя следующего cГіdigo, я смог способствовать тому, чтобы job сделал необходимое без проблемы.

USE [msdb]
GO

 /****** Object:  Job [Suplentes]    Script Date: 11/08/2019 13:32:54 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]]    Script Date: 
11/08/2019 13:32:54 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE 
name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', 
@name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Suplentes', 
    @enabled=1, 
    @notify_level_eventlog=0, 
    @notify_level_email=0, 
    @notify_level_netsend=0, 
    @notify_level_page=0, 
    @delete_level=0, 
    @description=N'Habilitar y deshabilitar los suplentes.', 
    @category_name=N'[Uncategorized (Local)]', 
    @owner_login_name=N'NA\user', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [VerificaTiempos]    Script Date: 11/08/2019 13:32:54 
******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, 
@step_name=N'VerificaTiempos', 
    @step_id=1, 
    @cmdexec_success_code=0, 
    @on_success_action=1, 
    @on_success_step_id=0, 
    @on_fail_action=2, 
    @on_fail_step_id=0, 
    @retry_attempts=0, 
    @retry_interval=0, 
    @os_run_priority=0, @subsystem=N'TSQL', 
    @command=N'
    UPDATE T
    SET ACTIVO = 0
    FROM TABLEORIGINAL T
    WHERE ACTIVO = 1 
    AND CONVERT(DATE,FCH_FIN) = CONVERT(DATE, GETDATE())/*actulizo mi tabla original si es igua*/', 
    @database_name=N'Database', 
    @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

DECLARE @schedule_uid uniqueidentifier;

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, 
@name=N'JobSche1', 
    @enabled=1, 
    @freq_type=8, 
    @freq_interval=62, 
    @freq_subday_type=1, 
    @freq_subday_interval=1, 
    @freq_relative_interval=0, 
    @freq_recurrence_factor=1, 
    @active_start_date=20191105, 
    @active_end_date=99991231, 
    @active_start_time=154500, 
    @active_end_time=235959, 
    @schedule_uid=@schedule_uid
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name 
= N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO
1
ответ дан 01.12.2019, 12:13
  • 1
    я пробую, но он не обновляет меня в точный час в, как реестры, например здесь CONVERT (Я ВОСХОДИЛ, FCH_FIN) = CONVERT (Я ВОСХОДИЛ, GETDATE ()) только этот actulizando с датой, но он не принимает во внимание час, я считаю зарегистрированными в моей таблице 2019-11-11 07:00:00.000 и хочу сравнить это поле с GETDATE (), но никогда не происходи, потому что, может быть, в сравнении getdate уже они провели секунды, и никогда он не равен моему реестру. – Manny 11.11.2019, 18:08
  • 2
    С твоего có я говорю, что оригинал принимает во внимание только дату для comparació n. có я говорю взятие все линии с той же датой так, что час не имеет значение. – Luis Cazares 11.11.2019, 18:12
  • 3
    он правилен..., но я хотел бы принять во внимание час, но когда я выполняю getdate, никогда не совпадай я воображаю из-за вопроса секунд. – Manny 11.11.2019, 19:32

Теги

Похожие вопросы