В настоящее время я работаю над процедурой импорта SQL для импорта данных из устаревшего приложения в более современную надежную систему. Подпрограмма просто импортирует данные из устаревшей таблицы в виде плоского файла (хранящейся в виде файла .csv) в SQL Server по классическому шаблону порядок/порядок-подробности. Вот как выглядят обе таблицы:
**LEGACY_TABLE**
Cust_No
Item_1_No
Item_1_Qty
Item_1_Prc
Item**INVOICE**
Invoice_No
Cust_No
**INVOICE_LINE_ITEM**
Invoice_No
Item_No
Item_Qty
Item_Prc
No
Item**INVOICE**
Invoice_No
Cust_No
**INVOICE_LINE_ITEM**
Invoice_No
Item_No
Item_Qty
Item_Prc
Qty
Item**INVOICE**
Invoice_No
Cust_No
**INVOICE_LINE_ITEM**
Invoice_No
Item_No
Item_Qty
Item_Prc
Prc
...
Item_7_No
Item_7_Qty
Item_7_Prc
Как вы можете видеть, устаревшая таблица представляет собой электронную таблицу с 22 столбцами, которая используется для представления клиента, а также до 7 элементов, их количества и цены покупки соответственно.
Новые таблицы выглядят так:
**INVOICE**
Invoice_No
Cust_No
**INVOICE_LINE_ITEM**
Invoice_No
Item_No
Item_Qty
Item_Prc
Мой быстрый и грязный подход состоял в том, чтобы создать реплику LEGACY_TABLE (давайте назовем ее LEGACY_TABLE_SQL) в SQL Server. Эта таблица будет заполнена из файла .csv с помощью импорта базы данных, который уже встроен в приложение.
Оттуда я создал хранимую процедуру для фактического копирования каждого значения из таблицы LEGACY_TABLE_SQL в таблицы INVOICE/INVOICE_LINE_ITEM. а также обрабатывать базовые логические ограничения (т. е. выполнять проверки существования, проверять наличие уже открытых счетов и т. д.). Наконец, я создал триггер базы данных, который вызывает хранимую процедуру при вставке новых данных в таблицу LEGACY_TABLE_SQL.
Хранимая процедура выглядит примерно так:
CREATE PROC IMPORT_PROCEDURE
@CUST_NO
@ITEM_NO
@ITEM_QTY
@ITEM_PRC
Однако вместо того, чтобы вызывать процедуру один раз, я фактически вызываю хранимую процедуру семь раз (по одному разу для каждого элемента) с помощью триггера базы данных. Я выполняю хранимую процедуру только тогда, когда ITEM_NO НЕ NULL, чтобы учесть пустые элементы в файле .csv. Поэтому мой триггер выглядит так:
CREATE TRIGGER IMPORT_TRIGGER
if ITEM_NO_1 IS NOT NULL
begin
exec IMPORT_PROCEDURE (CUST_NO,ITEM_NO_1, ITEM_QTY_1, ITEM_PRC_1)
end
...так далее и так далее.
Я не уверен, что это самый эффективный способ выполнить эту задачу. Есть ли у кого-нибудь какие-либо советы или идеи, которыми они не против поделиться?