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

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

есть 1000 файлов .csv, которые нужно загрузить в таблицу.
как заюзать xp_cmdshell или что-то другое чтобы, не прописывать 1000 раз путь к файлам ?
28 фев 18, 09:02    [21223859]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
assmsk
Member

Откуда:
Сообщений: 173
Например выгрузите во временную таблицу названия ваших файлов и потом подставляйте их названия в динамический запрос в цикле

Create table #t (file_name varchar(max))
INSERT #t
EXEC xp_cmdshell 'dir /b "C:\*.CSV';
28 фев 18, 09:10    [21223865]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
svanrus
Member

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

спасибо за совет, но больше не проблема как выгрузить этот список в табличку, а как сам курсор c bulk-ом написать.

Как вместо @ подставить этот список ?

BULK INSERT #t_vasya
FROM 'C:\cur_bulk_280218\@' -- менять по необходимости
WITH
(
firstrow = 2,
MAXERRORS = 0,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n',
DATAFILETYPE='widechar',
CODEPAGE = 'ACP'
);
go
28 фев 18, 09:29    [21223913]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Кусочек
Guest
Вам же уже ответили.

assmsk
Например выгрузите во временную таблицу названия ваших файлов и потом подставляйте их названия в динамический запрос в цикле

Create table #t (file_name varchar(max))
INSERT #t
EXEC xp_cmdshell 'dir /b "C:\*.CSV';
28 фев 18, 09:33    [21223925]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
assmsk
Member

Откуда:
Сообщений: 173
Надеюсь поймете идею



Declare @t table (nn int identity,file_name varchar(max))
Declare @i int = 1
Declare @strSQL varchar(max)

INSERT @t
EXEC xp_cmdshell 'dir /b "C:\cur_bulk_280218\*.CSV';

While @i <= (Select max(nn) from @t)
begin

Set @strSQL = 'BULK INSERT #' + (Select file_name from @t where nn = @i) +
'FROM 'C:\cur_bulk_280218\' + (Select file_name from @t where nn = @i) +
' WITH
(
firstrow = 2,
MAXERRORS = 0,
FIELDTERMINATOR = ''\t'',
ROWTERMINATOR = ''\n'',
DATAFILETYPE=''widechar'',
CODEPAGE = ''ACP''
);'


exec(@strSQL)

Set @i = @i + 1
end
28 фев 18, 09:48    [21223983]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
svanrus
Member

Откуда:
Сообщений: 53
Спасибо большое, сейчас буду изучать.

а так не получится ?

пока ошибка
Msg 4860, Level 16, State 1, Line 1
Cannot bulk load. The file "+@a+" does not exist.

в файле лежат пути к 1000 файлам.

DECLARE @a VARCHAR(50);
SET @a='C:\2.txt'
DECLARE @b VARCHAR(500);
SET @b='BULK INSERT t_konkud_test_bulk
FROM ''+@a+''
WITH
(MAXERRORS = 0,
FIELDTERMINATOR = ''\t'',
ROWTERMINATOR = ''\n'',
DATAFILETYPE=''widechar'',
CODEPAGE = ''ACP'') '
exec(@b);
28 фев 18, 09:56    [21224005]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
svanrus
Member

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


Declare @tf table (nn int identity,file_name varchar(max))
Declare @i int = 1
Declare @strSQL varchar(max)

--drop table #t1
insert into @tf
exec master.dbo.xp_cmdshell 'dir /b C:\work_ne_trogat /O:E'

--select * from @tf
--Select file_name from @tf
While @i <= (Select max(nn) from @tf)


begin

Set @strSQL = 'BULK INSERT t_vasya' + (Select file_name from @tf where nn = @i) +
'FROM ''C:\work_ne_trogat\'' + (Select file_name from @tf where nn = @i) +
'' WITH
(
firstrow = 1
,FIELDTERMINATOR = '';''
,ROWTERMINATOR = ''\n''
,tablock
);'


exec(@strSQL)

Set @i = @i + 1
end



вроде уже близок , но пока вылазит море однотипных ошибок



Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'января'.
Msg 1087, Level 15, State 2, Line 1
Must declare the table variable "@tf".
Msg 105, Level 15, State 1, Line 6
Unclosed quotation mark after the character string '
,tablock
);'.


у меня подозрения, что чему-то не хватает длины строки, но не понимаю чему... Мб кто видит причину ?
28 фев 18, 10:48    [21224105]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
svanrus,

а что ваша таблица @tf должна быть видна в EXEC()???
28 фев 18, 10:52    [21224119]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
с каывычками у вас бред какой-то
как то так наверное
автор
Set @strSQL =
'BULK INSERT t_vasya' + (Select file_name from @tf where nn = @i) +
'FROM ''C:\work_ne_trogat\''' + (Select file_name from @tf where nn = @i) +
' WITH
(
firstrow = 1
,FIELDTERMINATOR = '';''
,ROWTERMINATOR = ''\n''
,tablock
);'
28 фев 18, 10:54    [21224127]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
While @i <= (Select max(nn) from @tf)

Зато не курсор! Рукалицоплескаю.
28 фев 18, 10:57    [21224132]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Мне кажется так правильнее:
Set @strSQL = 
'BULK INSERT t_vasya' + (Select replace(file_name,' ','') from @tf where nn = @i) +
' FROM ''C:\work_ne_trogat\' + (Select file_name from @tf where nn = @i) + 
''' WITH
(
firstrow = 1
,FIELDTERMINATOR = '';''
,ROWTERMINATOR = ''\n''
,tablock
);'
28 фев 18, 10:59    [21224140]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Kopelly,
иможно и так
Declare @t table (nn int identity,file_name varchar(max))
Declare @i int = 1 
Declare @strSQL varchar(max)

INSERT @t
EXEC xp_cmdshell 'dir /b "e:\*.CSV';

SELECT @strSQL = ISNULL(@strSQL,'') + 
	'BULK INSERT #' + [file_name] + ' FROM ''C:\cur_bulk_280218\''' + [file_name] +
	' WITH
	(
	firstrow = 2,
	MAXERRORS = 0,
	FIELDTERMINATOR = ''\t'',
	ROWTERMINATOR = ''\n'',
	DATAFILETYPE=''widechar'',
	CODEPAGE = ''ACP''
	);' + CHAR(13)
FROM @t
WHERE [file_name] IS NOT NULL

EXEC (@strSQL)
28 фев 18, 11:12    [21224186]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
Kopelly,
иможно и так

почти получилось! осталось правильно кавычки расставить...
28 фев 18, 11:15    [21224196]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Руслан Дамирович
TaPaK
Kopelly,
иможно и так

почти получилось! осталось правильно кавычки расставить...

развлекайтесь
28 фев 18, 11:19    [21224221]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
assmsk
Member

Откуда:
Сообщений: 173
Svanrus, если проблемы сформированием динамического запроса сначала поставьте print вместо exec, чтобы наглядно понять в каком месте у вас ошибка
28 фев 18, 11:31    [21224256]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
развлекайтесь

Угу (с) после сборки доработать напильником...
DECLARE @t TABLE ( [nn] INT IDENTITY(1,1), [filename] VARCHAR(MAX) )
DECLARE @tSQL NVARCHAR(MAX) = N''

INSERT @t ( [filename] )
EXEC xp_cmdshell 'dir /b "C:\cur_bulk_280218\*.csv"';

SELECT @tSQL += 
  N'BULK INSERT
    ' + QUOTENAME( 't_vasya_' + @filename ) + N'
  FROM
    ' + QUOTENAME( 'C:\cur_bulk_280218\' + @filename, '''' ) + N'
	WITH (
	  FIRSTROW        = 2,
	  MAXERRORS       = 0,
	  FIELDTERMINATOR = ''\t'',
	  ROWTERMINATOR   = ''\n'',
	  DATAFILETYPE    = ''WIDECHAR'',
	  CODEPAGE        = ''ACP''
	);' + CHAR(13)
FROM @t
WHERE [file_name] IS NOT NULL

EXECUTE sp_executesql @tSQL
28 фев 18, 11:42    [21224295]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Руслан Дамирович,

fail, пилите дальше
28 фев 18, 11:43    [21224301]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
svanrus
Member

Откуда:
Сообщений: 53
спасибо всем!
28 фев 18, 12:37    [21224481]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Владислав Колосов
Member

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

если научитесь работать с Integration Services подобные задачи не будут вызывать никаких проблем.
28 фев 18, 12:56    [21224551]     Ответить | Цитировать Сообщить модератору
 Re: bulk insert в цикле  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Владислав Колосов
svanrus,

если научитесь работать с Integration Services подобные задачи не будут вызывать никаких проблем.

нах еото ужос powershell наше все
1 мар 18, 11:41    [21227768]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить