powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / обновление в курсоре
2 сообщений из 2, страница 1 из 1
обновление в курсоре
    #39884988
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Есть процесс, который ищет новую дату и производит обновление. Когда все объекты обновлены согласно новой дате, обновляет статус с 1 на ноль.
Использую 2 таблицы: 1 источник и 1 целевая.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
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 14: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

...
Рейтинг: 0 / 0
обновление в курсоре
    #39884991
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для проерки просто вставляю поочереди в ставляю поочереди новую дату в таблицу 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', 'Закрыт: А')
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / обновление в курсоре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]