Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
пользуюсь mssql 2008r2 Developer Edition

На входе есть 10 .csv файлов для импорта.
Название файла - id, который хочу проставлять в одной из полей таблицы, в которую импортируются данные из файла.
1. Возможно ли это сделать и как?

2. Возможно ли делать импорт не одного файла за раз, а разработать скрипт, который бы обрабатывал по-очереди все файлы например из одной папки.
16 авг 12, 15:53    [13021475]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
egaraev
Member

Откуда:
Сообщений: 63
MS Integration Services тебе поможет.
16 авг 12, 16:04    [13021564]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
можно конечно и OPENROWSET прикрутить
но для этих целей, создан MS Integration Services
16 авг 12, 16:54    [13021968]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
HandKot
можно конечно и OPENROWSET прикрутить
но для этих целей, создан MS Integration Services


Для этих целей не использовал SSIS, Есть линк
или пример живой?
16 авг 12, 17:12    [13022121]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
ola_ya_22
Member

Откуда:
Сообщений: 251
можно вручную:щелкаешь по названию базы ->выбираешь задачи->импорт данных и далее с помощью импорта.
16 авг 12, 17:14    [13022134]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
free_walker
Member

Откуда: Эта страна
Сообщений: 823
BULK INSERT
16 авг 12, 17:18    [13022161]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
free_walker
BULK INSERT


и...
вы хотите сказать у булка есть такие опции, которые мне необходимы?)
16 авг 12, 18:02    [13022460]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Большая цаца.
Можете импорт забить на одно конкретное имя. Просто в цикле делать ReName файлу (копирование/перенос в конкретное место).
16 авг 12, 18:32    [13022599]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Не говоря о кошерном BCP.
16 авг 12, 18:33    [13022609]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
Mnior
Большая цаца.
Можете импорт забить на одно конкретное имя. Просто в цикле делать ReName файлу (копирование/перенос в конкретное место).


Кстати да,как вариант. Согласен с вами, правда звучит конечно,хуже чем считывать имя и записывать по очереди файлы.
16 авг 12, 19:01    [13022739]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
danton
Mnior
Можете импорт забить на одно конкретное имя.
Кстати да,как вариант.
Ну, на самом деле BULK INSERT капризный. Он проверяет файлы на время компиляции (а не исполнения), что довольно-таки не удобно. И имел баги.
BCP удобнее. Хотя я всё равно настаиваю на одном имени даже в этом случае - надёжнее по многим причинам (проверено собственной задницей ).
Дьявол в деталях.
16 авг 12, 22:27    [13023532]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
Mnior
Хотя я всё равно настаиваю на одном имени даже в этом случае - надёжнее по многим причинам (проверено собственной задницей ).
Дьявол в деталях.


А вы не пропустили этот факт...

danton
Название файла - id, который хочу проставлять в одной из полей таблицы


Тем более все файлы еще надо одинаково назвать.
Например 100 файлов, как то мне это тяжело представляется,
интересно было бы посмотреть на подобную реализацию.
16 авг 12, 23:26    [13023728]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
danton
как то мне это тяжело представляется


я про средства только скуля и командной строки конечно.
16 авг 12, 23:35    [13023774]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
danton
А вы не пропустили этот факт...
danton
Название файла - id, который хочу проставлять в одной из полей таблицы
И что?

danton
Тем более все файлы еще надо одинаково назвать.
Не понял вашего непонимания.
Имеется каталог с файлами, для каждого файла пройтись:
1. Переместить/переименовать в определённое место/имя очередной файл, выдав имя и забэкапив
2. Закачать
3. Повторить п.1

При непредвиденных сбоях закачиваемый файл известен - предсказуемый разбор полётов.
Проблема не потерять ID файла? Ну это у кого как, обычно делается бэкап закачиваемым файлам. Мало ли чё (а вдруг сервак копыта откинет).
Поэтому 1й пункт это чисто запуск статического BAT/CMD файла. Чистая модульность, скулю фиолетово внешняя кухня (FTP, EMail, Web), он только запускает конкретный скрипт и закачивает файл по конкретному пути.

квадратишь практишь гуд
17 авг 12, 00:22    [13023947]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
Mnior
1. Переместить/переименовать в определённое место/имя очередной файл, выдав имя и забэкапив


Не пойму одного...
Например на входе файлы:
Client_Name_1.csv
Client_Name_2.csv
Client_Name_3.csv
Client_Name_4.csv
Client_Name_5.csv
Client_Name_6.csv

И например есть таблица соответствия:

CREATE TABLE [dbo].[BOM_Exchange] (
  [СlientID] int IDENTITY(1, 1) NOT NULL,
  [ClientName] varchar(max) NOT NULL,
  )
ON [PRIMARY]
GO


Вы предлагаете брать по одном файлу переименовывать,например:
1.csv

Куда-то записать имя файла. И потом при загрузки файла проставить это имя в определенное поле.
Я вас правильно понял?
17 авг 12, 12:39    [13025897]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
danton
Вы предлагаете брать по одном файлу переименовывать,например:
1.csv

Куда-то записать имя файла. И потом при загрузки файла проставить это имя в определенное поле.
Я вас правильно понял?
Как то у вас всё очень сложно.

Предлагается создать в пакете шаг, который импортит файл с именем "temp.csv"

Этот шаг нужно засунуть в цикл, где для каждого файла из вашего списка будет делаться копирование "ваш файл" -> temp.csv, и потом вызывается шаг импорта
17 авг 12, 15:11    [13027230]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
SSIS идеально подходит. Там есть и цикл по файлам и имя файла в переменной всегда лежит - легко запихать в таблицу, и даже сложный парсинг кривых файлов при желании сделать не проблема, а потом еще и по разным папкам раскладывать загруженные файлы можно.

Если один раз что-то грузануть конечно можно и bcp. Но как промышенный вариант - однозначно SSIS
17 авг 12, 19:24    [13028747]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
...и даже разархивацию! файлов сделать можно
17 авг 12, 19:24    [13028748]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Ivan Durak
Но как промышенный вариант - однозначно SSIS
Му-ха-ха
Однозначна? Уж нет, мы от этого SSIS уже избавлялись и не жалеем.
Никакого преимущества. Это сугубо личный фетишизм. Кто-то мышко-дрочество любит и имеет аллергию на скрипты.
ГУЙ не добавляет мозгов быдлокодерам.

Ivan Durak
Там есть и цикл
Убило.
17 авг 12, 19:46    [13028783]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
alexeyvg
Этот шаг нужно засунуть в цикл, где для каждого файла из вашего списка будет делаться копирование "ваш файл" -> temp.csv, и потом вызывается шаг импорта


Все понял.
Тогда последний вопрос, я смогу считать имя файла в переменную, и каким то образом присвоить это значение одному из полей таблицы куда импортируется текущий файл?
17 авг 12, 20:09    [13028866]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Ivan Durak
Если один раз что-то грузануть конечно можно и bcp. Но как промышенный вариант - однозначно SSIS
ИМХО наоборот, SSIS удобен для разовых работ на коленке.
danton
Тогда последний вопрос, я смогу считать имя файла в переменную, и каким то образом присвоить это значение одному из полей таблицы куда импортируется текущий файл?
В смысле, можно ли сделать цикл по файлам в пакете?

Конечно, используете Foreach Loop, там можно имя очередного обрабатываемого файла класть в переменную.

Вот пример:
http://www.sqlis.com/post/Looping-over-files-with-the-Foreach-Loop.aspx
17 авг 12, 20:19    [13028899]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
danton
Member

Откуда:
Сообщений: 170
alexeyvg
Конечно, используете Foreach Loop, там можно имя очередного обрабатываемого файла класть в переменную.

Вот пример:
http://www.sqlis.com/post/Looping-over-files-with-the-Foreach-Loop.aspx


Спасибо, буду разбираться, как сделаю свое решение - отпишу.
17 авг 12, 20:29    [13028943]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
danton,
DECLARE @CMD ([Line] Int Identity PRIMARY KEY, [Result] VarChar(256));
DECLARE	 @Result	Int;
	,@File		SysName
BEGIN TRY WHILE (1 = 1) BEGIN
	INSERT @CMD(Result) EXEC @Result = sys.xp_CmdShell 'Z:\Path\Load.cmd'; IF (@Result != 0) RAISERROR('CMD',18,1);
	SELECT @File = Result FROM @CMD WHERE Result IS NOT NULL
	IF (@@RowCount != 1) BREAK;	-- Тут лучше проверить тщательнее
	-- Используем @File, сохраняя в таблице файлов или как поле по умочанию, али ещё как
	BULK INSERT dbo.LoadTable FROM 'Z:\Path\Load.csv' WITH (FormatFile = 'Z:\Path\Format.xml', MaxErrors = 0);
	-- Или здесь используем @File, к примеру при переносе в освновную таблу
	DELETE @CMD; EXEC @Result = sys.xp_CmdShell 'Z:\Path\Clear.cmd'; IF (@Result != 0) RAISERROR('CMD',18,1);
	-- Можно конечно Clear.cmd и в Load.cmd пихнуть, но это не безопасно, можно ошибку предыдущего прохода потерять
END END TRY BEGIN CATCH
	-- Обработка ошибок, используя и @CMD и другие ошибки
END CATCH
# CMD
0. Проверка чистоты
1. Берём откудато очередное файло
2. Бекапим
3. Распаковываем, декриптуем, преобразем в нужный вид
4. Возвращаем в Pipe первоначальное название файла
5. Ставим в Z:\Path\Load.csv
# При этом можно весь "поток" направить в "лог файл" > Z:\Path\Log.txt
# Главное, чтоб при сбое на любом шаге, скрипт закончился и вернул не нулевое значение (базовые основы Shell скриптов)

Иногда и по другому делают:
Таблицу @CMD используют как лог, а данные (имя файла) считывают из файла, заранее приготавливаемое в Load.cmd
Кто на что горазд.
BULK INSERT можно и в Load.cmd засунуть как BCP.
17 авг 12, 21:25    [13029171]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
alexeyvg
ИМХО наоборот, SSIS удобен для разовых работ на коленке.

совершенно иного менения, Вы "просто не умеете их готовить" (с). Уж "лучше день потерять, потом за пять минут долететь" (с)

Mnior
DECLARE @CMD ([Line] Int Identity PRIMARY KEY, [Result] VarChar(256));
DECLARE @Result Int;
,@File SysName
BEGIN TRY WHILE (1 = 1) BEGIN
INSERT @CMD(Result) EXEC @Result = sys.xp_CmdShell 'Z:\Path\Load.cmd'; IF (@Result != 0) RAISERROR('CMD',18,1);
SELECT @File = Result FROM @CMD WHERE Result IS NOT NULL
IF (@@RowCount != 1) BREAK; -- Тут лучше проверить тщательнее
-- Используем @File, сохраняя в таблице файлов или как поле по умочанию, али ещё как
BULK INSERT dbo.LoadTable FROM 'Z:\Path\Load.csv' WITH (FormatFile = 'Z:\Path\Format.xml', MaxErrors = 0);
-- Или здесь используем @File, к примеру при переносе в освновную таблу
DELETE @CMD; EXEC @Result = sys.xp_CmdShell 'Z:\Path\Clear.cmd'; IF (@Result != 0) RAISERROR('CMD',18,1);
-- Можно конечно Clear.cmd и в Load.cmd пихнуть, но это не безопасно, можно ошибку предыдущего прохода потерять
END END TRY BEGIN CATCH
-- Обработка ошибок, используя и @CMD и другие ошибки
END CATCH

и получаем помимо поддержки скрипта, еще и поддержку батников, плюс включенный xp_cmdshell .
Mnior, по предыдущим темам, я решил, что Вы сторонник простых и прозрачных решений, но видать, Ваши подходы непостоянны и меняются по непонятному алгоритму :)

вот как вариант, мое решение
--объявляем переменные
Declare @t Table (fname varchar(150), depth int, fl int)
Declare @sql VarChar(1000)

--получаем список файлов
Insert into @t(fname, depth, fl)
Exec master..Xp_dirtree 'c:\*.txt', 1, 1

--удаляем уже обработанные файлы
Delete t From @t t
Where Exists (Select 1 from LoadTable lt Where lt.fname = t.fname)

--бежим по списку
Declare @fname varchar(150)

While 1=1
Begin
	--получаем очередное имя файла
	Select Top (1) @fname = fname From @t
	
	--если ничего нет, то выходим 
	If @fname Is Null BREAK
	
	--импортим
	Set @sql = '
		INSERT INTO LoadTable(fname, col1, col2, col3) 
		SELECT ''' + @fname + ''' AS fname, 
	    * FROM OPENROWSET(BULK N''' + @fname + ''', FORMATFILE = ''c:\values.fmt'') t '

	Exec (@sql)
	
	Delete from @t Where fname = @fname
End

1. в скрипте могут быть ошибки, т.к писал на коленке
2. повторюсь, если решение на постоянной основе, то я выбираю SSIS
20 авг 12, 09:31    [13035123]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с помощью MSSQL  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Mnior
Ivan Durak
Но как промышенный вариант - однозначно SSIS
Му-ха-ха
Однозначна? Уж нет, мы от этого SSIS уже избавлялись и не жалеем.
Никакого преимущества. Это сугубо личный фетишизм. Кто-то мышко-дрочество любит и имеет аллергию на скрипты.
ГУЙ не добавляет мозгов быдлокодерам.

Ivan Durak
Там есть и цикл
Убило.

что убило? не просто цикл, а специальный цикл по файлам - for each file. Сразу причем можно файло после загрузки раскидать - загруженое переместить в один фолдер, файлы с ошибками в другой.... и емейл отправить с результатами. Все это скриптами через xp_cmdshell делать - это, похоже на прораммирование на ассемблере - прошлый век, пардон...
20 авг 12, 11:29    [13035706]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить