SQL Server: импорт и архивирование еженедельных данных

#sql-server #import #archive

#sql-server #импорт #Архив

Вопрос:

Любые идеи / предложения приветствуются….

Меня попросили придумать простой способ импорта новых данных, которые мы получаем от внешнего поставщика (текстовые файлы). Мы получаем несколько текстовых файлов, и каждый из них необходимо импортировать в отдельную таблицу. Для некоторых таблиц необходимо переместить текущие / существующие данные в вызываемую таблицу TABLENAME_Previous (для работы с различными существующими отчетами), затем очистить текущую таблицу и импортировать в нее новые данные. Кроме того, любые данные, находящиеся в таблице «предыдущий», должны быть добавлены в таблицу архива.

Вот пример:

customer.txt поступает от поставщика….

  1. Сначала мы перемещаем содержимое customers_previous в customers_arch

  2. Далее мы перемещаем содержимое customers в customers_previous

  3. Наконец, мы импортируем новый customers.txt файл в таблицу customers

Кто-нибудь когда-либо писал процедуру SQL для этого или знает, где ее найти, которую было бы не слишком сложно изменить?

Спасибо

Комментарии:

1. Является ли customer.txt файл с разделителями или фиксированный? Примеры данных текстового файла тоже помогут.

2. CSV с разделителями-запятыми на самом деле у нас есть 12 разных текстовых файлов, каждый из которых содержит от 10 до 50 полей, поэтому было бы сложно опубликовать их содержимое здесь

3. Согласуются ли имена текстовых файлов каждую неделю? И все таблицы являются textfilename_перед textfilename_arch и т. Д.? Если имена непротиворечивы, служба службы безопасности должна быть в состоянии справиться с этим.

4. Да, они согласованы (к счастью!)

5. Я никогда не использовал SSIS, можете ли вы указать мне ресурс, чтобы найти способ сделать это?

Ответ №1:

вы можете попробовать что-то вроде этого:

Чтобы скопировать ваши предыдущие данные в архив

 Insert into customers_arch select * from customers_previous
  

Чтобы скопировать данные вашего клиента в предыдущий:

 truncate table customers_previous;
insert into customers_previous select * from customers
  

Затем, чтобы загрузить текстовый файл, используйте Bulk Insert для загрузки таблицы клиентов после ее очистки.

 truncate table customers;
bulk    insert customers
from    'd:yourfoldercustomers.txt'
WITH   
      (  
         FIELDTERMINATOR =',',  
         ROWTERMINATOR ='n'  
      );
  

Обновить:
Хорошо, Брайан, чтобы ответить на ваш другой вопрос, как запустить его для нескольких файлов, сохраненных в вашей WeeklyTable.

Предположим, что ваша еженедельная таблица выглядит следующим образом:

 Declare @WeeklyTable TABLE(ID int Identity(1,1), [FileName] varchar(50))
insert into @WeeklyTable Values
('Customers'),('Orders'), ('Order_Details')
  

Вы можете создать динамический запрос для запуска вашего скрипта для каждого файла.

 Declare @Template varchar(max)
Set @Template = '
    -- Start of [[FILENAME]] --------------------
    Insert into [FILENAME]_arch select * from [FILENAME]_previous
    GO

    truncate table [FILENAME]_previous;
    insert into [FILENAME]_previous select * from [FILENAME]
    GO

    truncate table [FILENAME];
    bulk    insert [FILENAME]
    from    ''d:yourfolder[FILENAME].txt''
    WITH   
          (  
             FIELDTERMINATOR ='','',  
             ROWTERMINATOR =''n''  
          );


'
Declare @s varchar(max)
Declare @FileName varchar(50)
Declare @ID int =0

Select TOP 1 @ID=ID, @FileName=[FileName] From @WeeklyTable Where ID>@ID order by ID
While @@ROWCOUNT>0 Begin
    Set @s = REPLACE(@Template, '[FILENAME]', @FileName)
    Print @s
--  EXEC(@s)  -- Uncomment to EXEC the script.
    Select TOP 1 @ID=ID, @FileName=[FileName] From @WeeklyTable Where ID>@ID order by ID
End
  

Комментарии:

1. Спасибо, я попробую … выглядит довольно просто!

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

3. Как я мог бы запустить это для каждой из таблиц, названных в таблице с именем SELECT [FileName] ,[FileAfterRename] ,[TableName]

4. Черт возьми, я продолжаю случайно добавлять новые незавершенные комментарии… ОГО! В любом случае… Как я могу запустить это для каждой таблицы в таблице с именем WeeklyFiles с полем с именем FieldName

5. @BrianBattles, пожалуйста, ознакомьтесь с обновленным кодом, который будет использоваться для нескольких файлов, сохраненных в ваших файлах WeeklyFiles.