Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 обновление в курсоре  [new]
dermama
Member

Откуда:
Сообщений: 207
Всем привет.
Есть процесс, который ищет новую дату и производит обновление. Когда все объекты обновлены согласно новой дате, обновляет статус с 1 на ноль.
Использую 2 таблицы: 1 источник и 1 целевая.

+
CREATE TABLE test_source
(
InDateTime datetime NOT NULL,
comment		varchar(255) NOT NULL
)

INSERT INTO test_source
VALUES
('2019-11-05 13:29:20.883', 'Закрыт: А'),
('2019-11-05 13:36:57.860', 'Закрыт: Б'),
('2019-11-05 13:39:56.627', 'Закрыт: В'),
('2019-11-05 13:47:37.780', 'Закрыт: Г'),
('2019-11-05 13:48:55.977', 'Закрыт: Д'),
('2019-11-05 13:52:09.550', 'Закрыт: Е'),
('2019-11-05 13:55:08.767', 'Закрыт: Ж')


CREATE TABLE test_dest
(
Filial nvarchar(1) NOT NULL,
InDateTime datetime NULL,
Status bit NULL
)

INSERT INTO test_dest
VALUES
('Ж', '2019-11-05 13:55:08.767', 0),
('Д', '2019-11-05 13:48:55.977', 0),
('Б', '2019-11-05 13:36:57.860', 0),
('В', '2019-11-05 13:39:56.627', 0),
('Г', '2019-11-05 13:47:37.780', 0),
('А', '2019-11-05 13:29:20.883', 0),
('Е', '2019-11-05 13:52:09.550', 0)

-------------------------------------------------

Для процесса разработал алгоритм. Все идет по плану до тех пор пока я не появляется предпоследняя новая дата. - процесс ее обновляет и простовляет статус 1 - вроде бы все в порядке - но если перезапустить процесс еще, когда еще не появилась самая последняя новая дата он обнуляет статусы на 0. Такого не происходит если  обновились только 5 дат. Проблемы начинаются когда обновились 6 дат и остается 1 не обновленная - как будто бы уже появилась и 7мая.

Подскажите, пожалуйста, в чем ошибка.

Для проерки просто вставляю поочереди в ставляю поочереди новую дату в таблицу test_source посредством замены ('Ж', '2019-11-05 13:55:08.767', 0) на ('Ж', '2019-11-05 [b]14[/b]:55:08.767', 0) и нажимаю EXECUTE и так поочереди, пока не дохожу до 6ой даты.

Заранее благодарен за помощь.

BEGIN



DECLARE @day_of_week						nvarchar(8)
DECLARE @Status								INT
DECLARE @Error								nvarchar(80)


DECLARE @Filial								nvarchar(8)

DECLARE @InDateTime							datetime
DECLARE @InDateTime_Source				    datetime
DECLARE @Endlich							nvarchar(80)

IF OBJECT_ID('tempDB..#test_Source') IS NOT NULL
DROP TABLE #test_Source


	SELECT TOP (5000) InDateTime, Comment
	INTO #test_Source
	FROM test_source 
	ORDER BY InDateTime DESC

IF OBJECT_ID('tempDB..#test_Source2') IS NOT NULL
DROP TABLE #test_Source2

	SELECT InDateTime, SUBSTRING(Comment, 9, 1) AS Filial
	INTO #test_Source2
	FROM #test_Source
	WHERE comment LIKE '%закрыт%'

	

--0--Проверим текущий день недели, так как только в понедельник закрытие и за пятницу и за субботу

	SET @day_of_week = (SELECT
						 CASE DATEDIFF(DAY,0, GETDATE())%7
						  WHEN 0 THEN 'Monday'
						  WHEN 1 THEN 'Tuesday'
						  WHEN 2 THEN 'Wednesday'
						  WHEN 3 THEN 'Thursday'
						  WHEN 4 THEN 'Friday'
						  WHEN 5 THEN 'Saturday'
						  WHEN 6 THEN 'Sunday'
						 END [День недели])
						 
	DECLARE fcursor CURSOR FOR
	SELECT	[Filial],
			[InDateTIme],
			[Status]
	FROM test_dest
	
	OPEN fcursor
	
	FETCH NEXT FROM fcursor INTO @Filial,
								 @InDateTime,
								 @Status

		WHILE (@@FETCH_STATUS = 0)
			BEGIN
				IF @day_of_week IN ('monday')
					BEGIN	
						SET @Status = (SELECT Status FROM test_dest WHERE Filial = @Filial)
						SET @InDateTime_Source	= (SELECT MAX(s.InDateTime)
												   FROM			#test_Source2		s
												   LEFT JOIN	test_dest			d	ON s.Indatetime = @indatetime												
												   WHERE s.filial = @filial
												   AND s.Indatetime > @indatetime)
							
							IF  @InDateTime_Source IS NULL AND @Status = 1
							
								BEGIN
									SET @Error = 'филиал ' + @Filial + ' был закрыт ранее'
									RAISERROR (@Error, 16, 1)
								END
																	
								ELSE
									BEGIN
										
										IF   @InDateTime_Source IS NOT NULL AND @Status != 1  
											BEGIN
												UPDATE test_dest
												SET InDateTime = @InDateTime_Source,
													Filial = @Filial,
													[Status] = 1
												WHERE Filial = @Filial

												SET @Error = 'филиал ' + @Filial + ' только что обновлен'
												PRINT @error
											END
									
										
									END

									
																								
					END
	FETCH NEXT FROM fcursor INTO @Filial,
								 @InDateTime,
								 @Status

			END
	CLOSE fcursor  
    DEALLOCATE fcursor

	IF @Status = 1 
		BEGIN			
			PRINT 'Последний Филиал закрыт, статусы закрытия выставлены в положение 0'

			UPDATE test_dest
			SET Status = 0
			WHERE Status = 1
		END
	ELSE
		BEGIN
			RAISERROR ('не все филиалы обновлены', 16 , 1)
		END
				
							
END


Сообщение было отредактировано: 4 ноя 19, 22:42
4 ноя 19, 15:56    [22009417]     Ответить | Цитировать Сообщить модератору
 Re: обновление в курсоре  [new]
dermama
Member

Откуда:
Сообщений: 207
Для проерки просто вставляю поочереди в ставляю поочереди новую дату в таблицу test_source посредством замены ('Ж', '2019-11-05 13:55:08.767', 0) на ('Ж', '2019-11-05 14:55:08.767', 0) и нажимаю EXECUTE и так поочереди, пока не дохожу до 6ой даты.

Прошу прощения, вставляю в test_source ('2019-11-05 14:29:20.883', 'Закрыт: А') вместо ('2019-11-05 13:29:20.883', 'Закрыт: А')
4 ноя 19, 15:58    [22009420]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить