Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
Друзья, помогите! Необходимо автоматизировать процедуру импорта текстовика по части наименования. В скрипте ниже происходит импорт файла OV_20160831, дата файла может быть любой. те маска файла OV_######## .

Как сделать так, чтобы происходил импорт по части файла?? Допустим, через месяц необходимо будет осуществить импорт OV_20160930.
p/s Менять название файла в скрипте не вариант.


--СКРИПТ
BULK INSERT by_TRN_KK_tmp from 'C:\Users\Litonov-ef\Documents\test\OV_20160831.txt' --название файлов
WITH (CODEPAGE = 'ACP',
BATCHSIZE =1000000,
FIELDTERMINATOR ='|',
FIRSTROW = 2,
MAXERRORS = 0,
ROWTERMINATOR = '/n'
TABLOCK)
22 сен 16, 17:11    [19697663]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
madlen700,

а если в папке будет два файла?
а вообще либо динамика либо ssis, выбирайте
22 сен 16, 17:22    [19697721]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
WarAnt,

В моем случае, 2х файлов с одинаковым наименованием быть не может :)

Удобнее, наверное динамикой..
22 сен 16, 17:42    [19697799]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
WarAnt, А пример решения будет? :))
23 сен 16, 09:12    [19698998]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4906
Папка всегда одна?
Тогда xp_cmdshell в помощь:
exec xp_cmdshell 'dir путь до папки'

Получаете список файлов, находите свой.

з.ы. возможно надо будет включить возможность использования xp_cmdshell.
23 сен 16, 10:37    [19699271]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
Megabyte, да, папка одна. Спасибо!!!
23 сен 16, 11:21    [19699516]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
Megabyte, запустил, получилось просмотреть содержимое папки. А как выбрать нужный файл и осуществить импорт (в моем случае это BULK INSERT)?
23 сен 16, 11:29    [19699562]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4906
madlen700
Megabyte, запустил, получилось просмотреть содержимое папки. А как выбрать нужный файл и осуществить импорт (в моем случае это BULK INSERT)?

insert exec xp_cmdshell в таблицу, там фильтруешь.
23 сен 16, 16:20    [19701491]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
Megabyte, спасибо.


create table #t (name nvarchar(255))
insert into #t
exec xp_cmdshell 'dir C:\Users\Documents\test'

Select * from #t where name like '%OV_OBOROTY%'

Предположим, что нашел нужный файл для загрузки, а дальше-то как? Я имею ввиду импортировать данный файл в БД? Вот в чем вопрос у меня..
26 сен 16, 15:55    [19709257]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
aleks2
Guest
madlen700
Megabyte, спасибо.


create table #t (name nvarchar(255))
insert into #t
exec xp_cmdshell 'dir C:\Users\Documents\test'

Select * from #t where name like '%OV_OBOROTY%'

Предположим, что нашел нужный файл для загрузки, а дальше-то как? Я имею ввиду импортировать данный файл в БД? Вот в чем вопрос у меня..


1. По-уму - это делается скриптом powershell и bcp.exe.
2. Но если с умом туго - есть два варианта:
2.1. Динамически собрать
declare @str nvarchar(4000) = 'BULK INSERT by_TRN_KK_tmp from '''
+ @fileName
+ ''' WITH (CODEPAGE = ''ACP'',
BATCHSIZE =1000000,
FIELDTERMINATOR =''|'',
FIRSTROW = 2,
MAXERRORS = 0,
ROWTERMINATOR = ''/n''
TABLOCK)';

exec (@str);

2.2. Переименовать/скопировать файл в фиксированное имя.
26 сен 16, 18:24    [19710366]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
aleks2,

Положил в папку всего 1 файл. Запустил, так, как вы написали. Где ошибка?

drop table ALLFILENAMES
CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255))

declare @filename varchar(255)
declare @str nvarchar(4000) = 'BULK INSERT by_TRN_KK_tmp from ''C:\Users\Litonov-ef\Documents\test\'
+ @fileName
+ '*.txt'' WITH (CODEPAGE = ''ACP'',
BATCHSIZE =1000000,
FIELDTERMINATOR =''|'',
FIRSTROW = 2,
MAXERRORS = 0,
ROWTERMINATOR = ''/n''
TABLOCK)'

insert into ALLFILENAMES
exec (@str);
27 сен 16, 15:53    [19714196]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
komrad
Member

Откуда:
Сообщений: 5250
Megabyte
Папка всегда одна?
Тогда xp_cmdshell в помощь:
exec xp_cmdshell 'dir путь до папки'

Получаете список файлов, находите свой.

з.ы. возможно надо будет включить возможность использования xp_cmdshell.


есть спец проца для этого: xp_dirtree

а xp_cmdshell, по-хорошему, должна быть заблокирована
27 сен 16, 17:43    [19714861]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
komrad, Спасибо! Очень помогло.

Я получил нужное мне название файла, благодаря данной процедуре. А каким образом запихнуть это дело в BULK INSERT, чтобы осуществить импорт данного файла?
28 сен 16, 09:34    [19716622]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
komrad
Member

Откуда:
Сообщений: 5250
madlen700
komrad, Спасибо! Очень помогло.

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


см. п.2.1 в ответе aleks2

+ надо понимать, что файл должен находиться там, куда "дотянется" сиквел
т.е. он должен быть либо на серверном диске, либо на сетевой шаре
в обоих случаях, учетной записи сиквела нужно иметь права на чтение с диска/шары
28 сен 16, 10:02    [19716756]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
komrad,


Спасибо, а можно более подробно разложить? я пытался последовать примеру 2.1., понимаю, что ошибка где-то кроется, но опыта в с данными функциями нет, поэтому не могу понять..



drop table ALLFILENAMES
CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255))

declare @filename varchar(255)
declare @str nvarchar(4000) = 'BULK INSERT by_TRN_KK_tmp from ''C:\Users\Litonov-ef\Documents\test\'
+ @fileName
+ '*.txt'' WITH (CODEPAGE = ''ACP'',
BATCHSIZE =1000000,
FIELDTERMINATOR =''|'',
FIRSTROW = 2,
MAXERRORS = 0,
ROWTERMINATOR = ''/n''
TABLOCK)'

insert into ALLFILENAMES
exec (@str);
28 сен 16, 12:05    [19717486]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
komrad
Member

Откуда:
Сообщений: 5250
madlen700,

показывайте ошибку

+ вопрос:
вот эта папка (''C:\Users\Litonov-ef\Documents\test\") где находится?
на вашем компе или на сервере?
28 сен 16, 13:55    [19718150]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
komrad
Member

Откуда:
Сообщений: 5250
madlen700
komrad,


Спасибо, а можно более подробно разложить?


у вас должно быть что-то похожее на это:

+ скрипт

/*объявляем переменные*/
declare @tbl table (dir nvarchar(512),d tinyint,f tinyint)
declare @path nvarchar(512)
declare @file nvarchar(512)
declare @str nvarchar(4000)

/*указываем папку для просмотра*/
select @path=N'папка на сервере'

/*начитываем всё из нее*/
insert into @tbl (dir,d,f)
exec xp_dirtree @path,1,1

/*здесь должна быть логика по выбору необходимого файла*/
/*сейчас берется первый попавшийся*/
select top 1 @file=dir from @tbl where f=1

/*проверка выбранного файла*/
--select @file 

/*конструируем команду по заливке файла в таблицу by_TRN_KK_tmp*/
select @str = N'BULK INSERT by_TRN_KK_tmp from '''+@path+N'\'+ @file
+ N''' WITH (CODEPAGE = ''ACP''
,BATCHSIZE =1000000,
,FIELDTERMINATOR =''|''
,FIRSTROW = 2
,MAXERRORS = 0
,ROWTERMINATOR = ''/n''
,TABLOCK)'

/*проверка того, что собрали*/
--select @str [BCP COMMAND]

/*выполняем заливку*/
exec (@str)


28 сен 16, 14:44    [19718483]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
aleks2
Guest
madlen700
drop table ALLFILENAMES
CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255))

declare @filename varchar(255)
declare @str nvarchar(4000) = 'BULK INSERT by_TRN_KK_tmp from ''C:\Users\Litonov-ef\Documents\test\'
+ @fileName
+ '*.txt'' WITH (CODEPAGE = ''ACP'',
BATCHSIZE =1000000,
FIELDTERMINATOR =''|'',
FIRSTROW = 2,
MAXERRORS = 0,
ROWTERMINATOR = ''/n''
TABLOCK)'

insert into ALLFILENAMES
exec (@str);


А в @filename имя файла святым духом надует?
28 сен 16, 15:03    [19718612]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Спасибо, а можно более подробно разложить? я пытался последовать примеру 2.1., понимаю, что ошибка где-то кроется, но опыта в с данными функциями нет, поэтому не могу понять..

drop table ALLFILENAMES
CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255))

declare @filename varchar(255)
declare @str nvarchar(4000) = 'BULK INSERT by_TRN_KK_tmp from ''C:\Users\Litonov-ef\Documents\test\'
+ @fileName
+ '*.txt'' WITH (CODEPAGE = ''ACP'',
BATCHSIZE =1000000,
FIELDTERMINATOR =''|'',
FIRSTROW = 2,
MAXERRORS = 0,
ROWTERMINATOR = ''/n''
TABLOCK)'

insert into ALLFILENAMES
exec (@str);[/quote]
А как вы думаете, что такое by_TRN_KK_tmp в вашем коде? Что написано в справке по BULK INSERT про это?
Почему в первом вашем посте нету insert into ALLFILENAMES, а тут есть?

Вы активнее читайте хелп и примеры оттуда, это же простой стейтмент, что бы его без помощи других людей нельзя было бы написать хоть как то.
28 сен 16, 15:26    [19718782]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
komrad, Спасибо огромное! Получилось
28 сен 16, 15:30    [19718809]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT импорт по части наименования ХЭЛП  [new]
madlen700
Member

Откуда:
Сообщений: 11
alexeyvg, примеров то не особо много, особенно для тех, кто никогда не сталкивался с подобными функциями. Задача срочная была, поэтому пришлось просить помощи.

Еще раз всем спасибо!!!
28 сен 16, 15:32    [19718823]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить