-------------
-- Обновление RecordDate и RecordTime 
-- 2024-01-10
-------------

-------------
-- Создаем две временные таблицы. 
-------------

CREATE TABLE #TMP_Exam(
	MedicalRecordID uniqueidentifier
	,mrDate date
	,mrTime datetime
)

CREATE TABLE #TMP_Exam_DEL(
	MedicalRecordID uniqueidentifier
	,mrDate date
	,mrTime datetime
)

GO
-------------
-- Заливаем данные в первую таблицу. 
-------------

INSERT INTO #TMP_Exam
SELECT mr.MedicalRecordID, COALESCE(mrO.RecordDate, acc.PostingDate), COALESCE(mrO.RecordTime, acc.PostingDate)
FROM [AKUZ].[T_ACCOMPANYING_DISEASES] ad 
	JOIN AKUZ.T_MEDICAL_RECORD mr on mr.MedicalRecordID = ad.MedicalRecordID
	JOIN AKUZ.T_MEDICAL_RECORD mrO on mrO.MedicalRecordID = ad.OutcomeOfInspection
	JOIN AKUZ.T_AMBULANCE_CARD_RECORD acc on acc.MedicalRecordID = ad.OutcomeOfInspection
where mr.RecordDate is null

GO
-------------
-- Создаём два индекса во временные таблицы. 
-------------

CREATE INDEX IX_TMP_EXAM ON #TMP_Exam (MedicalRecordID)
CREATE INDEX IX_TMP_EXAM_DEL ON #TMP_Exam_DEL (MedicalRecordID)

GO
-------------
-- Начинаем цикл с обновлением. 
-------------

DECLARE @C VARCHAR(100) = ''

WHILE ((SELECT COUNT(*) FROM #TMP_Exam) > 0)
BEGIN
	
	-- Удаляем первые n строк из первой временной таблицы и через output вставляем во вторую
	DELETE TOP (20000) TC
	OUTPUT DELETED.MedicalRecordID, DELETED.mrDate, DELETED.mrTime INTO #TMP_Exam_DEL (MedicalRecordID, mrDate, mrTime)
	FROM #TMP_Exam TC
	
	UPDATE mr
		SET	RecordDate = ED.mrDate, RecordTime = ED.mrTime
	--SELECT *
	FROM AKUZ.T_MEDICAL_RECORD mr
	JOIN #TMP_Exam_DEL ED ON ED.MedicalRecordID = mr.MedicalRecordID

	-- Принт сообщения о количестве обработанных строк, что бы было визуально понимание что происходит
	SET @C = 'Количество строк обновлено: ' + CAST(@@ROWCOUNT AS VARCHAR(10))
	RAISERROR(@C, 0, 1) WITH NOWAIT;
	
	-- Очищение 2й времянки для последующей вставки следующих строк
	TRUNCATE TABLE #TMP_Exam_DEL
	
END

