2015-02-05 5 views
0

Я создаю веб-приложение ASP.net, которое получает файл CSV от пользователя, загружает файл на сервер, навалом копирует данные в TempHoldingTable. Затем код вызывает хранимую процедуру, которая содержит оператор Merge для копирования данных из TempHoldingTable в соответствующие несколько таблиц. Я использую SQL Server 2008 R2.SQL Bulk Upload, Merge and Delete records

У меня есть несколько Merge заявления в хранимой процедуре, я скопировал только один ниже:

MERGE Client AS C 
USING (SELECT ClientID, Value1, Value2, Value3, Row_Number() Over (PARTITION BY ClientID order by Date desc) as Rno 
     FROM TempHoldingTable) AS T ON (C.ClientID = T.ClientID) 

WHEN NOT MATCHED BY TARGET AND T.Rno = 1 
    THEN 
     INSERT(ClientID, Value1, Value2, Value3) 
     VALUES(T.ClientID, Value1, Value2, Value3)      
     OUTPUT $action, inserted.*, deleted.*; 

Файл CSV загружается каждый месяц, так что позволяет предположит, что первый файл был загружен в январе 2014 года и имеет следующий данные:

ClientID Value1 Value2 Value3 
111  abc def ghi 
222  jkl mno pqr 

затем пользователь будет загружать второй файл в феврале 2014 года и имеет следующие данные:

ClientID Value1 Value2 Value3 
111  aaa bbb ghi 
222  jkl mno pqr 
333  sss ttt uuu 

Процедура Объединить будет обновлять таблицу клиента для ClientID 111, потому что value1 & значение2 были изменены, оставьте ClientID 222, как это и вставить новую строку для ClientID 333.

Мой вопрос, если пользователь решит удалите файл Feb 2014, как я могу отслеживать и возвращать изменения, которые были вызваны из-за загрузки в феврале 2014 года, чтобы таблица Client содержала те же данные, что и после загрузки в январе 2014 года.

Обратите внимание, что это отслеживание должно выполняться для каждой загрузки, так что всякий раз, когда пользователь удаляет файл, база данных возвращается к той же позиции, что и в предыдущем месяце.

Мой второй вопрос заключается в том, как изменить инструкцию Merge для обновления значений, если ClientID существует, а любой столбец имеет другое значение, чем предыдущее.

Спасибо за ваше терпение, прочитав все это, и любая помощь будет принята с благодарностью.

+0

Таким образом, если пользователь, где удалить файл Feb2014, у вас будет вернуться к набору Jan 2014, а затем воспроизводить файлы за март, апрель, Май и так далее ... Это правильно? – SoulTrain

+0

Пользователям будет разрешено только удалять файл в обратном порядке, поэтому, если последний файл был загружен в марте, после удаления файла Feb им удаляется файл March. Когда они удаляют файл March, данные будут возвращены к тому, как это было при загрузке файла Feb. И когда они удаляют файл Feb, тогда данные будут возвращены в январе. Как только у нас будут данные Jan, пользователю будет разрешено снова загрузить файл Feb, затем в марте и так далее. – learner

+0

Насколько велики ваши данные? – SoulTrain

ответ

0

Ответ на Q1: Основываясь на размере ваших данных, я думаю, что создание механизма отслеживания (Change tracking /CDC) будет чрезмерным (IMO). Возможно, вы, возможно, настроили процесс, который (перед применением файла) выталкивает данные из каждой из 8 таблиц в другой набор таблиц (версированный набор данных), который хранит его в зависимости от месяца/года. Если пользователь решает удалить файл определенного месяца, вытащите предыдущий набор из набора данных версий и примените его к активным таблицам.

Не забудьте настроить процесс очистки для версии dataset, хотя, может быть, это может стать довольно большим сверхурочным временем.

Ответ Q2: Вы можете использовать When Matched пункт

MERGE Client AS C 
USING (SELECT ClientID, Value1, Value2, Value3, Row_Number() Over (PARTITION BY ClientID order by Date desc) as Rno 
     FROM TempHoldingTable) AS T ON (C.ClientID = T.ClientID) 

WHEN NOT MATCHED BY TARGET AND T.Rno = 1 
    THEN 
     INSERT(ClientID, Value1, Value2, Value3) 
     VALUES(T.ClientID, Value1, Value2, Value3)      
WHEN MATCHED 
     THEN UPDATE SET C.Value1 = T.Value1 
     , C.Value2 = T.Value2 
     , C.Value3 = T.Value#3 
OUTPUT $action, inserted.*, deleted.*; 
+0

Спасибо за ответ, я бы подумал немного больше и поговорю с коллегами завтра, мне нравится идея отдельной версии таблицы. Из любопытства, как будет реализован механизм отслеживания, мы должны решить пойти по этому маршруту? Обратите внимание, что мы ожидаем приобрести несколько клиентов, поэтому, если у нас будет 10 клиентов, каждый клиент будет загружать по одному файлу каждый месяц (всего 10 файлов). Каждый клиент будет иметь свои собственные данные, но он будет храниться в одной базе данных, дифференцированной CustomerID. Если мы приобретем 20 Клиентов, тогда это будет 20 файлов каждый месяц. Пожалуйста посоветуй. – learner

+0

Я говорил с коллегами, и мы хотели бы пойти с этим маршрутом, который вы рекомендовали. Разве вы не планируете никаких проблем с этим, кроме очистки, поскольку количество загружаемых файлов каждый месяц может быстро увеличиваться. Не могли бы вы предоставить некоторую информацию о том, как реализовать отслеживание mechansim? Спасибо за вашу помощь. – learner

+0

Для механизма отслеживания SQL-сервера начинайте с чтения следующих статей: 1. Отмените отслеживание https://msdn.microsoft.com/en-us/library/bb933875.aspx 2: Измените захват данных https: // technet. microsoft.com/en-us/library/bb522489%28v=sql.105%29.aspx – SoulTrain