#sql-server #import #archive
#sql-server #импорт #Архив
Вопрос:
Любые идеи / предложения приветствуются….
Меня попросили придумать простой способ импорта новых данных, которые мы получаем от внешнего поставщика (текстовые файлы). Мы получаем несколько текстовых файлов, и каждый из них необходимо импортировать в отдельную таблицу. Для некоторых таблиц необходимо переместить текущие / существующие данные в вызываемую таблицу TABLENAME_Previous
(для работы с различными существующими отчетами), затем очистить текущую таблицу и импортировать в нее новые данные. Кроме того, любые данные, находящиеся в таблице «предыдущий», должны быть добавлены в таблицу архива.
Вот пример:
customer.txt
поступает от поставщика….
-
Сначала мы перемещаем содержимое
customers_previous
вcustomers_arch
-
Далее мы перемещаем содержимое
customers
вcustomers_previous
-
Наконец, мы импортируем новый
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.