В базе данных sql server 2008 у меня есть набор таблиц, в которых я хочу регулярно сохранять историю.Для этого я создал еще один набор таблиц для хранения этой истории.По сути, структура базы данных выглядит следующим образом:
+---------------+ +---------------+
| TableA | | TableAHistory |
+---------------+ +---------------+
| Key |<--+ | Key |<----+
| DataA | | | Date | |
| | | | DataA | |
+---------------+ | +---------------+ |
| |
+---------------+ | +-----------------+ |
| TableB | | | TableBHistory | |
+---------------+ | +-----------------+ |
| Key | | | Key | |
| TableAKey |---+ | TableAHistoryKey|---+
| DataB | | DataB |
+---------------+ +-----------------+
С этой структурой у меня возникают проблемы при создании хранимой процедуры, которая может копировать текущие данные в таблицы истории.Я могу легко создать оператор вставки, который копирует данные из TableA в TableAHistory, но копирование данных TableB вызывает у меня проблемы.При копировании данных в TableBHistory я не вижу, как найти то, каким должен быть TableAHistoryKey.Вот как выглядят операторы вставки:
INSERT TableAHistory([Date], DataA)
SELECT CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE())),
DataA
FROM TableA
INSERT TableBHistory([TableAHistoryKey], DataB)
SELECT ??? AS TableAHistoryKey,
DataB
FROM TableB
Единственное, о чем я могу подумать, - это добавить поле в таблицы истории, чтобы временно сохранить ключ соответствующей таблицы.Затем я могу присоединиться к TableA, TableAHistory и TableB во втором операторе вставки, что даст мне доступ к правильному TableAHistoryKey.Я бы предпочел не делать этого, так как этот добавленный столбец будет использоваться только для копирования данных.
Есть ли другой (общий) способ сделать это?
Редактировать : Просто чтобы добавить немного ясности, Key
в TableAHistory генерируется и не совпадает с Key
в TableA.То же самое касается TableBHistory и TableB.
Редактировать : В настоящее время эту историю нужно сохранять только ежемесячно, и у нас есть соглашение для хранения «месяц / год»в качестве даты в первый день месяца.Отсюда странный CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE()))
.Вероятно, не лучший способ сделать это, но это работает.