2016-01-31 4 views
1

Поскольку я новичок в SQL Server и мои скрипты еще не очень отшлифованы. Мне нужны предложения по этому вопросу.Расписание импорта плоских файлов с разными именами на SQL-сервер 2014

я получаю файлы с удаленного сервера на моей машине (около 700/день) следующим образом:

ABCD.100.1601310200 
ABCD.101.1601310210 
ABCD.102.1601310215 

Naming Convention: Здесь в первой части «ABCD» остается тем же самым, средняя часть идентификатор последовательности, который находится в инкрементальном порядке для каждого файла. Последняя часть - отметка времени.

Файл не имеет специального расширения, но его можно открыть с помощью блокнота/excel. Поэтому его можно назвать плоским файлом. Каждый файл состоит из 95 столбцов и 20000 строк, исправленных с некоторым количеством мусора на вершине 4 и внизу 4 строки столбца 1.

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

+0

Вы можете запланировать три отдельных заданий, чтобы импортировать каждый файл ... Будет ли эта работа для вас? –

+0

На ежедневной основе у меня было бы около 700 файлов, каждый из которых имел бы другое имя файла (инкрементное число). На данный момент я копирую эти файлы (с пакетом окон) в один текстовый файл, и из них я импортирую его в базу данных. Но я ищу встроенное решение на SQL-сервере. – Ayaz

+0

* «700+ файлов» *> Это важная информация, которая должна быть включена в ваш вопрос! –

ответ

0

Есть, вероятно, и другие способы сделать это, но это один из способов:

  1. Создайте файл формата для таблиц. Вам нужно только создать его один раз. Используйте этот файл в сценарии импорта в шаге 2.
  2. Создайте сценарий импорта, основанный на OPENROWSET(BULK '<file_name>', FORMATFILE='<format_file>'
  3. Перечня сценария из шага 2 в SQL Server для запуска с базой данных вы хотите, чтобы данные, импортированный в

Создайте файл формата

Это создает файл формата, который будет использоваться в следующем шаге. Следующий скрипт создает файл формата в C:\Temp\imp.fmt на основе существующей таблицы (замените TEST_TT на базу данных, в которую вы импортируете). Это создает такой файл формата с , в качестве разделителя полей. Если файлы имеют вкладку в качестве разделителя, удалите переключатель -t,.

DECLARE @cmd VARCHAR(8000); 
SET @cmd='BCP TEST_TT.dbo.[ABCD.100.1601310200] format nul -f "C:\Temp\imp.fmt" -c -t, -T -S ' + (SELECT @@SERVERNAME); 
EXEC master..xp_cmdshell @cmd; 

Перед выполнением этого вам необходимо будет перенастроить SQL Server, чтобы хранимую процедуру xp_cmdshell. Вам нужно сделать это только один раз.

EXEC sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
EXEC sp_configure 'xp_cmdshell', 1 
GO 
RECONFIGURE 
GO 

импорта сценарий

Этот сценарий предполагает:

  • файлы должны быть импортированы в отдельных таблицах
  • Файлы расположены в C:\Temp
  • Файл формата C:\Temp\imp.fmt (генерируется в предыдущем шаге)

SET NOCOUNT ON; 
DECLARE @store_path VARCHAR(256)='C:\Temp'; 
DECLARE @files TABLE(fn NVARCHAR(256)); 
DECLARE @list_cmd VARCHAR(256)='DIR ' + @store_path + '\ABCD.* /B'; 
INSERT INTO @files EXEC master..xp_cmdshell @list_cmd; 
DECLARE @fullcmd NVARCHAR(MAX); 
SET @fullcmd=(
    SELECT 
     'IF OBJECT_ID('''+QUOTENAME(fn)+''',''U'') IS NOT NULL DROP TABLE '+QUOTENAME(fn)+';'+ 
     'SELECT * INTO '+QUOTENAME(fn)+' '+ 
     'FROM OPENROWSET(BULK '''[email protected]_path+'\'+fn+''',FORMATFILE=''C:\Temp\imp.fmt'') AS tt;' 
    FROM 
     @files 
    WHERE 
     fn IS NOT NULL 
    FOR XML PATH('') 
); 
EXEC sp_executesql @fullcmd;