|
обновление в курсоре
#39884988
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Всем привет.
Есть процесс, который ищет новую дату и производит обновление. Когда все объекты обновлены согласно новой дате, обновляет статус с 1 на ноль.
Использую 2 таблицы: 1 источник и 1 целевая.
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
|
|
|