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

Откуда:
Сообщений: 1978
Прочёл FAQ - встретил упоминание о DTS Package.

Возник вопрос - как его использовать и что в моём случае делать?
У меня есть Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

На сервере есть База, в базе есть несколько таблиц для хранения данных, и парные им таблицы изменений, в которых ведётся учёт изменений, вносимых в таблицы данных.

Требуется: автоматизировать на сервере процесс ежемесячной выгрузки файлов инкрементального обновления таблиц данных в формате csv, с разделителями столбцов - |, первой строкой должны быть названия столбцов, отделённые друг от друга тем же разделителем.
Имя файла должно состоять из имени таблицы, имени базы данных, и даты выгрузки.
Для каждого файла необходимо предусмотреть возможность изменения имени и маски имени в соответствии с локальными настройками.

При этом имеем возможность удаления строк из БД, что отображается в таблице учёта изменений, и в случае инкрементального обновления требует, как я понимаю, создания в файлах обновлений столбца - флага удаления записи.

Как мне подсказали, требуется создать хранимую процедуру или функцию, которую надо скармливать Package, и для ежемесячного выполнения задачи надо создать Task на сервере.
Но вот как это всё сделать... Сделать SQL запрос выборки данных любой сложности - не проблема, оформить это как процедуру или функцию - тоже, а вот остальное...
Касательно прав на сервере и на базу данных - тоже вопрос, а какие именно права и на что именно мне нужны? (Дать-то мне их дадут, но хочется знать, что именно и для чего просить.)
Под рукой Microsoft SQL Server Management Studio 2008, обрезанная MS Visual Studio 2008 и полноценная 2010.
Имеется скромный опыт работы с Server Management Studio и написания учебных хранимых процедур, функций и триггеров, а также огромный опыт работы с Jet SQL (Access) и VBA.
24 авг 11, 15:27    [11172062]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
skorpk
Member

Откуда: Волгоград
Сообщений: 276
Ну тогда там просто. Можете с помощью мастера Import and Export все это автоматизировать.
24 авг 11, 15:36    [11172152]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1978
skorpk
Ну тогда там просто. Можете с помощью мастера Import and Export все это автоматизировать.


При помощи SQL Server Business Intelligence Development Studio создал пакет SSIS (.dtsx), который получает на входе SQL-запрос, и сохраняет итоги запроса в .csv-файл с жёстко заданным именем.
Вопрос: Как мне сделать имя файла вычисляемым в зависимости от названия месяца и номера года?
Вопрос два: Как полученный .dtsx файл сделать ежемесячной задачей?
29 авг 11, 12:03    [11194081]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
DaniilSeryi
Вопрос: Как мне сделать имя файла вычисляемым в зависимости от названия месяца и номера года?
Нужно брать имя из переменной (см. в источнике свойство кажется Expression), переменную предварительно формировать в Script Task или SQL Task
DaniilSeryi
Вопрос два: Как полученный .dtsx файл сделать ежемесячной задачей?
Сделать задание (Job) для запуска
29 авг 11, 12:08    [11194111]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

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

Можете привести пример валидного выражения для Expressions, где в одну строку сливались бы текстовая часть и дата?
29 авг 11, 12:43    [11194354]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
iljy
Member

Откуда:
Сообщений: 8711
DaniilSeryi
alexeyvg,

Можете привести пример валидного выражения для Expressions, где в одну строку сливались бы текстовая часть и дата?

select 'abcde' + cast(getdate() as varchar)
29 авг 11, 13:00    [11194479]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

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

Спасибо за подсказку с Expressions. Всё, нашёл пример сам. Всё работает.

Если кому надо:
[url=]http://social.technet.microsoft.com/wiki/contents/articles/ssis-expression-examples.aspx[/url]
29 авг 11, 13:01    [11194486]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1978
Возник ещё один вопрос:
Требуется сделать выгрузку нескольких csv-файлов - каждый со своей периодичностью.
Как быть, если хочется это всё объединить в одном пакете - чтобы пакет стартовал, читал параметры выгрузок (имя, периодичность, папку для выгрузки) из таблицы SQL-сервера, и выгружал только необходимые файлы? Также необходимо учесть то, что число столбцов и их типы отличаются для каждого csv-файла.
30 авг 11, 16:53    [11202236]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
DaniilSeryi,

Можно такое сделать, но зачем? Сделай отдельный пакет для каждого файла.
30 авг 11, 17:11    [11202372]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

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

Идея в том, чтобы в дальнейшем не заморачиваться с добавлением каждого нового пакета на сервер - что в моём случае связано с кучей бюрократического геморроя - а просто добавлять новую запись в таблицу конфигурации.
Правда, тут проблема с маппингом input-output столбцов, как мне видится... Не считая всего остального.
30 авг 11, 17:35    [11202531]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
DaniilSeryi,

что бы не заморачиваться с маппингом - можно воспользоваться bcp - чудная программа.
30 авг 11, 17:48    [11202611]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

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

Я правильно понимаю, что параметры, необходимые bcp, мне нужно передать ей через свойство Arguments вкладки Process Execute Process Tasc-a в моём SSIS пакете? А чтобы можно было использовать сконструированную перед этим в Script Tasc-e строку аргументов, её надо записать в переменную, которая должна будет использоваться в выражении Arguments во вкладке Expressions этого же Execute Process Tasc-a?
1 сен 11, 15:12    [11213093]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
DaniilSeryi,

BCP в твоем случае была бы самым простым решением. И с SSIS-ом можно было бы не заморачиваться, все что надо - stored procedure который будет идти в таблицу, проверять что должно выполняться, генерировать строку для запуска BCP и запускать ее.
1 сен 11, 15:28    [11213230]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

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

Спасибо большое. Возможно, так и сделаю. Но довести до финала вариант с SSIS очень хочется, чтобы получить и закрепить навыки работы с ним - в первый раз с SSIS сталкиваюсь.
1 сен 11, 15:36    [11213313]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1978
Готово всё, осталось напильничком отполировать.
Теперь последний вопрос - bcp позволяет выгружать названия столбцов? Или придётся делать запрос с выводом имён столбцом и UNION JOIN-ить с запросом, где происходит convert в nvarchar нужных столбцов таблицы?
16 сен 11, 12:04    [11286447]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
DaniilSeryi,
По моему bcp не умеет писать заголовок.
Поэтому его надо формировать на этапе подготовки запроса (первая строка - заголовок, потом через UNION данные).

На что стоит обратить внимание: bcp имеет ограничение на длину запроса (не помню сколько, что-то около 4 тыс. символов).
Проблему можно решить созданием вьюшки и запихиванием в неё всей логики, а bcp настраивать на выгрузку уже всей вьюшки.

По поводу экспортов разных файлов и разной периодичности:
можно сделать настроечную табличку в которой будут содержаться правила экспорта и настройки (sql запрос, имя файла, путь) для каждого экспорта.
Например, если надо разные запросы в разные дни недели экспортировать, то можно в varchar (7) настроить маску для запуска типа такой 1000001 (выгружать только в субботу и воскресенье).

что-то вроде этого:
--создаём настроечную таблицу
CREATE TABLE [Test](
	[process] [varchar](50) NOT NULL,
	[mask_for_process] [varchar](7) NULL,
	[Sql] [varchar](max) NULL,
	[file_name] [varchar](200) NULL,
	[Path] [varchar](200) NULL
) ON [PRIMARY]

-- заполняем
INSERT [dbo].[Test] ([process], [mask_for_process], [Sql], [file_name], [Path]) VALUES (N'Export1', N'1000001', N'Select * from test', N'FileName1.csv', N'c:\')
INSERT [dbo].[Test] ([process], [mask_for_process], [Sql], [file_name], [Path]) VALUES (N'Export2', N'0111110', N'Select Top 100 * from test', N'FileName2.csv', N'c:\')

--забираем параметры экспорта, в маске которого для сегодняшнего дня стоит единичка
select * from Test
where substring(isnull(mask_for_process,'1111111'),datepart(dw,getdate()),1) = 1

В примере Export1 настроен на выгрузку по выходным всей таблицы, по будним дням Top 100.

ну а дальше, имея запрос, имя файла, путь передать эти параметры bcp - пара пустяков. и главное: никакого гемора с маппингами. И новый процесс добавляется путём добавления новой сточки в настроечную таблицу.
16 сен 11, 14:23    [11287960]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

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

Настроечная таблица уже давно создана и пашет, что даёт кучу возможностей. :-)
Вопрос был с заголовками.
16 сен 11, 14:52    [11288336]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
DaniilSeryi,

Увы, bcp не пишет заголовки. А жаль, нужное функционалко...
16 сен 11, 14:59    [11288421]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
Mgvlad
Member

Откуда: Минск
Сообщений: 97
DaniilSeryi
Mgvlad,

Настроечная таблица уже давно создана и пашет, что даёт кучу возможностей. :-)

редко залажу на форум, отстал от топика :):):)
16 сен 11, 15:00    [11288434]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1978
Доп. вопрос возник:

Есть запрос

declare @colums nvarchar(MAX)
set @colums=''
 SELECT @colums = @colums + [name] + '|' FROM sys.columns WHERE [object_id] = OBJECT_ID('База.Схема.Таблица') ORDER BY [column_id]
select @colums

В Management Studio запрос отрабатывает на отлично, выдавая перечень имён полей таблицы, разделённых |.
А вот когда пытаюсь скормить этот запрос bcp, то на выходе в файле получаю какой-то бред.

Как нужно изменить запрос, скармливаемый bcp, чтобы в файле, создаваемом bcp на диске, получить перечень имён полей таблицы, разделённых | ?
29 сен 11, 14:19    [11355275]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
DaniilSeryi,

SELECT @colums = @colums + [name] + '|' FROM

можно так
SELECT @colums = @colums + [name] + CHAR(124) FROM
29 сен 11, 14:28    [11355356]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
DaniilSeryi
А вот когда пытаюсь скормить этот запрос bcp, то на выходе в файле получаю какой-то бред.

Потому что результат такого "накопительного" запроса недокументирован из-за ORDER BY
29 сен 11, 14:30    [11355373]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1978
С запросом разобрался. В запросе имя таблицы надо было указать.

Вопрос теперь другой - как запустить .dtsx, созданный в 2008-й visual студии, на 2005-м SQL Servere?
Или как конвертировать проект .dtsx пакета из 2008-й в 2005-ю студию?

Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
12 окт 11, 09:41    [11424523]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
DaniilSeryi
Вопрос теперь другой - как запустить .dtsx, созданный в 2008-й visual студии, на 2005-м SQL Servere?

BOL - Running Packages
12 окт 11, 10:47    [11424887]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать экспорт из таблиц сервера в csv-файлы?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1978
Уточню вопрос. При установке пакета на сервер вылезает сообщение об ошибке:

===================================

The package failed to load due to error 0xC0010014 "One or more error occurred. There should be more specific errors preceding this one that explains the details of the errors. This message is used as a return value from functions that encounter errors.". This occurs when CPackage::LoadFromXML fails.


------------------------------
Program Location:

at Microsoft.SqlServer.Dts.Runtime.Application.LoadPackage(String fileName, IDTSEvents events, Boolean loadNeutral)
at Microsoft.SqlServer.Dts.Runtime.Application.LoadPackage(String fileName, IDTSEvents events)
at Microsoft.DataTransformationServices.Controls.PackageProtectionUtils.<>c__DisplayClass4.<LoadPackageFromFile>b__3(String password, IDTSEvents events)
at Microsoft.DataTransformationServices.Controls.PackageProtectionUtils.LoadPackageWithPassword(PackageLoader loader, IWin32Window dialogParent, String& packagePassword)
at Microsoft.DataTransformationServices.Controls.PackageProtectionUtils.LoadPackageFromFile(String file, IWin32Window dialogParent, String& packagePassword)
at Microsoft.DataTransformationServices.Controls.PackageLocationControl.LoadPackage(String& packagePassword)
at Microsoft.SqlServer.Dts.ObjectExplorerUI.ImportPackageAsAction.ImportPackage(ImportPackageAsForm dlg)

===================================

The package failed to load due to error 0xC0010014 "One or more error occurred. There should be more specific errors preceding this one that explains the details of the errors. This message is used as a return value from functions that encounter errors.". This occurs when CPackage::LoadFromXML fails.


------------------------------
Program Location:

at Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass.LoadPackage(String FileName, Boolean loadNeutral, IDTSEvents90 pEvents)
at Microsoft.SqlServer.Dts.Runtime.Application.LoadPackage(String fileName, IDTSEvents events, Boolean loadNeutral)
12 окт 11, 11:24    [11425234]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить