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

Откуда:
Сообщений: 466
Добрый день.

Подскажите, пожалуйста, нет ли у кого-нибудь готового скрипта по выгрузке резалсета в exel файл

Если нет, то подскажите, пожалуйста, в какую сторону копать.

Заранее благодарен.
21 ноя 13, 17:20    [15169946]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
ИльдарSR,

поищите в Гугле (или даже здесь). Пример кода в сети я видел.
21 ноя 13, 23:32    [15171218]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 530
ИльдарSR
Добрый день.

Подскажите, пожалуйста, нет ли у кого-нибудь готового скрипта по выгрузке резалсета в exel файл

Если нет, то подскажите, пожалуйста, в какую сторону копать.

Заранее благодарен.



Кроме совета копать траншею в сторону Сергея Брина и его компании на букву Гу,
могу посоветовать воспользоваться утилитой sqlcmd. ( входит в поставку, начиная с SQL 2005 )

Сначала с помощью sqlcmd результат запроса выводится в текстовый файл .CSV,
который затем затягивается в EXCEL/OO CALC/GNUMERIC

Есть некоторая сложность в выборе разделителя колонок. разумнее всего использовать <TAB>

гибче и удобнее использовать sqlcmd, указав ему входной и выходной файл(ы),
в которых соответственно содержатся sql-запрос и результат его исполнения.

ПРИМЕР:
( используется БД AdventureWorks2012 )

> SQLCMD -i input.sql -o output.csv

содержимое файлов:
INPUT.SQL
------------------

:SETVAR SQLCMDCOLSEP " " --уcтанавливает TAB, как разделитель полей при выводе
SET QUOTED_IDENTIFIER ON;
SELECT * FROM [AdventureWorks2012].[Sales].[vStoreWithDemographics]
GO



OUTPUT.CSV
---------------------
Business Entity ID Name Annual Sales Annual Revenue Bank Name Business Type Year Opened Specialty Square Feet Brands Internet Number Employees
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
292 Next-Door Bike Store 800000 80000 United Security BM 1996 Mountain 21000 2 ISDN 13
294 Professional Sales and Service 800000 80000 International Bank BM 1991 Touring 18000 4+ T1 14
296 Riders Company 800000 80000 Primary Bank & Reserve BM 1999 Road 21000 2 DSL 15



> "C:\Program Files (x86)\LibreOffice 4\program\scalc.exe" output.csv

Данный пример работоспособен при запуске на машине с локальным MS SQL,
если это не так, то добавляются ключи
> SQLCMD -S сервер -U пользователь -P пароль -i input.sql -o output.csv
22 ноя 13, 06:24    [15171829]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 530
volodin661,

данное решение в какой-то мере мультиплатформенное,
учитывая появление ODBC-драйвера MS SQL под Linux ( RHEL, SUSE )

22 ноя 13, 06:52    [15171848]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Спасибо большое, буду сейчас разбираться
22 ноя 13, 09:58    [15172322]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Добрый день.

Сделал, как было показано в примере

ini файл
:SETVAR SQLCMDCOLSEP " "
SET QUOTED_IDENTIFIER ON;
exec TestDB.dbo.ReportYaerd
GO

Далее запускал sqlcmd
Все работает, единственное, что никак не могу сообразить как сдеалать, при формировании exel файла вывод резалсета производится в одну колонку, а можно лт как-то сделать, чтобы каждый столбец в резалсете записывался в отдельный столбец в exel?

Так же запускал из QA работает, но весь резалсет в отдельном столбце
DECLARE
@DATEREPORT DATE = GETDATE(),
@EXEC VARCHAR(255)
SELECT @EXEC = 'xp_cmdshell ''sqlcmd -d TestDB -q "TestDB.dbo.ReportYaerd" -o C:\Report\'+ CONVERT(VARCHAR(15),@DATEREPORT,112) + '.csv'''
EXEC(@EXEC)

Подскажите, как можно отформатировать ?
25 ноя 13, 11:34    [15184196]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
при формировании exel файла вывод резалсета производится в одну колонку, а можно лт как-то сделать, чтобы каждый столбец в резалсете записывался в отдельный столбец в exel?

1. Вы формируте не excel, а текстовый файл с раширением csv.
2. Для того, чтобы excel правильно импортировал текстовый файл, разделитель полей должен быть правильным
25 ноя 13, 11:38    [15184228]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Т.е я неверно указал вот здесь?

:SETVAR SQLCMDCOLSEP " "
25 ноя 13, 11:48    [15184308]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
Т.е я неверно указал вот здесь?

:SETVAR SQLCMDCOLSEP " "

Вы свой текстовый файл открывали чем нибудь кроме excel ? И вы делали это для файлов полученных обеими сопосбами ?
25 ноя 13, 11:54    [15184346]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Открывал текстовым блокнотом и экселем

" И вы делали это для файлов полученных обеими сопосбами ?"
Вот это немного не понял((
25 ноя 13, 11:58    [15184373]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
Открывал текстовым блокнотом и экселем

И какой же разделитель увидели ?
И какой разделитель хочет excel ?

ИльдарSR
Вот это немного не понял((

Вы формируете фалй двумя способами.
Какой разделитель получается в каждом из сопсобов ?
25 ноя 13, 12:01    [15184390]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
В моем понимании вот это разделитель, пробел
:SETVAR SQLCMDCOLSEP " "

При открытии файла никаких разделителей не увидел(
25 ноя 13, 12:08    [15184417]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
ИльдарSR
Спасибо большое, буду сейчас разбираться


да, если будете искать, то пишите слово эксель так: Excel, а то может не найти
25 ноя 13, 12:10    [15184426]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
В моем понимании вот это разделитель, пробел

А пробел по-вашему это именно тот разделитель, который нужен excel ?
25 ноя 13, 12:16    [15184462]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
В том то и дело, не знаю какой поставить разделитель, подскажите, где можно про это почиать?
25 ноя 13, 13:34    [15185015]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
pio777
Member

Откуда:
Сообщений: 127
ИльдарSR
В том то и дело, не знаю какой поставить разделитель, подскажите, где можно про это почиать?

Попробуйте так:

declare @cmd varchar(8000)
set @cmd= 'bcp "'+db_name()+'.dbo.dicTable" out "\\T\TEMP\tmp.csv" -c -t"," -T -S '+@@servername
exec master..xp_cmdshell @cmd, no_output
25 ноя 13, 14:40    [15185628]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
declare @cmd varchar(8000)
set @cmd= 'bcp "[DEV].TestDB.dbo.ReportYaerd" out "C:\TEMP1\2255212.csv" -c -t"," -T -S '+@@servername
exec master..xp_cmdshell @cmd

A valid table name is required for in, out, or format options.
Но это как я понимаю на моей стороне ошибка, буду разбираться
25 ноя 13, 15:28    [15186064]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
pio777
Member

Откуда:
Сообщений: 127
ИльдарSR
declare @cmd varchar(8000)
set @cmd= 'bcp "[DEV].TestDB.dbo.ReportYaerd" out "C:\TEMP1\2255212.csv" -c -t"," -T -S '+@@servername
exec master..xp_cmdshell @cmd

A valid table name is required for in, out, or format options.
Но это как я понимаю на моей стороне ошибка, буду разбираться


Название сервера [DEV] тут лишнее. Должно быть так:
set @cmd= 'bcp "TestDB.dbo.ReportYaerd" out "C:\TEMP1\2255212.csv" -c -t"," -T -S '+@@servername
25 ноя 13, 16:05    [15186352]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
pio777
Название сервера [DEV] тут лишнее. Должно быть так:

У ТС-а объект TestDB.dbo.ReportYaerd является процедурой
25 ноя 13, 16:06    [15186363]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
pio777
Member

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

Не доглядел, думал, что это таблица.

ИльдарSR,
Тогда вам bcp не подойдет (объект должен быть {table_name | view_name} | "query"}).
Попытайтесь в свое первое решение поставить разделитель запятую. Или как вариант переделать процедуру и в нее добавить возможность выгружать через bcp.
25 ноя 13, 16:30    [15186512]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
ИльдарSR,

Позвольте узнать, для каких целей нужно выгружать набор строк в Эксель?
Для подготовки отчёта? Как этот отчёт будет выглядеть (сводная таблица, диаграмма или что)?
25 ноя 13, 16:32    [15186531]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
pio777
Тогда вам bcp не подойдет (объект должен быть {table_name | view_name} | "query"}).

Подойдет. Именно из-за "query"
25 ноя 13, 16:32    [15186533]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
pio777
Member

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

Я и не подозревал, что можно так использовать bcp:

declare @cmd varchar(8000)
set @cmd= 'bcp "exec TestDB.dbo.ReportYaerd" queryout "C:\TEMP1\2255212.csv" -c -t"," -T -S '+@@servername
exec master..xp_cmdshell @cmd
25 ноя 13, 16:43    [15186629]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Данный отчет будет отправляться другой компании

Отчет - обычная таблица с данными за период, которые формируются в резалсете

Спасибо большое откликнувшимся)

declare @cmd varchar(8000)
set @cmd= 'bcp "exec TestDB.dbo.ReportYaerd" queryout "C:\TEMP1\2255212.csv" -c -t"," -T -S '+@@servername
exec master..xp_cmdshell @cmd

Попробовал, выгрузка работает, правда отчет все равно в один столбец выгружается((, т.е откртываю файл через эксель, и вижу в сотлбце A все мои данные((

Не буду Вас более отвлекать((( буду думать над другим решением
25 ноя 13, 16:57    [15186760]     Ответить | Цитировать Сообщить модератору
 Re: Выгрзка в exel  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
буду думать над другим решением

Над чем ?
Как в Excel записать какой нибудь файл в формате cvs, а потом открыть его в Notepad и узреть уже, какой же разделитель нужен ?

Сообщение было отредактировано: 25 ноя 13, 17:02
25 ноя 13, 17:02    [15186782]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить