2016-10-31 2 views
0

Мне нужно навалом вставить текстовый файл, который всегда хранится в той же папке. Имя файла: «employee_date», где дата не всегда является фактической датой. Это динамическая дата, которую пользователь меняет каждый день (с форматом YYYYMMDDHHMM).массовые файлы вставки с именами файлов, которые меняются каждый день

Мне нужен запрос, который вставляет данные в этот текстовый файл (который уже отформатирован). Моя проблема заключается в том, что объемная вставка не работает с переменными или с *.txt или employes*.txt.

Мне нужен запрос, который содержит только файл, имя которого равно EMPLOYEE_YYYYMMDDHHMM.txt, которое может выполняться каждый день и всегда вставлять файл из этой папки, неважно, какая дата в имени файла.

+2

Вы можете использовать динамический SQL для всей команды или, например, использовать bcp вместо –

+0

Отредактировано для улучшения удобочитаемости. –

+0

Чтобы автоматизировать процесс импорта, вы можете использовать [SSIS] (https://msdn.microsoft.com/en-gb/library/ms169917.aspx?f=255&MSPPError=-2147217396). SSIS - это гибкий инструмент. Но эта гибкость стоит дорого. Сложнее сначала предложить подход @JamesZ. –

ответ

0

Вот что вы можете изменить в соответствии с вашими требованиями. У меня была аналогичная задача, когда мы получили файлы SFTP нам из системы Linux, и мне нужно было загрузить эти данные в SQL Server. Вот базовый макет ... понимание местоположений файлов, разрешений на папку, разрешений SQL и т. Д. Все нужно учитывать. Включая, если вы можете запустить командный код оболочки в своей среде.

CREATE procedure [dbo].[file_upload] 
as 

DECLARE @dt VARCHAR(10)               --date variable but stored as VARCHAR for formatting of file name 
DECLARE @fileLocation VARCHAR(128) = 'E:\SomeFolder\'       --production location which is 
DECLARE @sql NVARCHAR(4000)              --dynamic sql variable 
DECLARE @fileName VARCHAR(128)             --full file name variable 

--This stores the file names into a temp table to be used in a cursor. 
--The bottom part is handleing some date formatting i needed. You can change to what your files look like 
IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #FileNames 
CREATE TABLE #FileNames (
    id int IDENTITY(1,1) 
    ,subdirectory nvarchar(512) 
    ,depth int 
    ,isfile bit 
    ,fileDate date null 
    ,fileTime time null) 
INSERT #FileNames (subdirectory,depth,isfile) 
EXEC xp_dirtree @fileLocation, 1, 1 

UPDATE #FileNames SET 
         fileDate = CAST(SUBSTRING(subdirectory,LEN(subdirectory) - 19,10) AS DATE) 
         ,fileTime = CAST(REPLACE(SUBSTRING(subdirectory,LEN(subdirectory) - 8,5),'-',':') AS TIME) 


--here's the cursor to loop through all the files 
DECLARE c CURSOR FOR 
select subdirectory from #FileNames 

OPEN c 
FETCH NEXT FROM c INTO @fileName 

--For each file, bulk insert or what ever you want... 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     --set the dynamic with the appropriate delimiters, if you want to keep headers, etc. 
     SET @sql = 'BULK INSERT Server.dbo.someTable FROM '''+ @fileLocation + @fileName +''' WITH (FIELDTERMINATOR = ''|'',FIRSTROW=2,KEEPNULLS,ROWTERMINATOR = ''0x0a'')' 
     EXEC(@sql) 

     --do some other stuff like logging, updating, etc... 
    END 

CLOSE c 
DEALLOCATE c 
0

Это должно сделать это за вас. Просто отрегулируйте по мере необходимости.

DECLARE @intFlag INT 
SET @intFlag = 1 
WHILE (@intFlag <=48) 
BEGIN 

PRINT @intFlag 


declare @fullpath1 varchar(1000) 
select @fullpath1 = '''your_path_here\employee_' + convert(varchar, getdate()- @intFlag , 112) + '.txt''' 
declare @cmd1 nvarchar(1000) 
select @cmd1 = 'bulk insert [dbo].[your_table_name] from ' + @fullpath1 + ' with (FIELDTERMINATOR = ''\t'', FIRSTROW = 2, ROWTERMINATOR=''0x0a'')' 
exec (@cmd1) 


SET @intFlag = @intFlag + 1 

END 
GO