2016-11-18 10 views
0

Я хочу сгенерировать несколько отчетов excel с помощью сценариев vba, вызванных из хранимой процедуры. Моя команда получила почти одно решение BI, и ранее они использовали скрипт VBA, который открывал файл excel с макросами внутри.Лучший способ выполнить CMD из сценария SQL

процесс формирования отчетов следует по этому пути:

Там же процедура SQL Stored выполнена из еженедельной плановой работы, то мы называем другую процедуру, которая готовит и расчет данные, а затем мы открываем скрипта представлены ниже, чтобы запустить Excel.

Вот как этот сценарий выглядит следующим образом:

Set objExcel = CreateObject("Excel.Application") 
Set objWorkbook = objExcel.Workbooks.Open("E:\Path\To\Excel.xlsm") 

Мы называем этот сценарий таким образом:

EXEC master..xp_cmdshell 'C:\WINDOWS\SysWOW64\WSCRIPT.EXE Z:\Path\To\Script.vbs' 

У меня возникли проблемы с WScript.exe, это висит при открытии отчетов, а также при Я искал решение, о котором я много читал, не используя XP_CMDSHELL. И возникает вопрос: есть ли способ избежать использования XP_CMDSHELL и не создавать путь генерации отчетов с нуля? Я немного спешу, поэтому у меня нет времени писать новые процедуры и т. Д.

+0

Попробуйте использовать 'cscript.exe' вместо' wscript.exe' https://technet.microsoft.com/en-gb/library/bb490816.aspx. 'Wscript' вызывает ошибки и сообщения в GUI - это может быть причиной процесса висячего. –

+0

Если вы можете изменить «Хранимые процедуры» на «Таблично-оцененные функции» (лучше всего было ** inline-TVF **), это можно сделать намного проще. Вы просто открываете соединение ODBC и вызываете непосредственно из SQL Server, например 'SELECT * FROM dbo.MyFunction (@ prm1, @ prm2, ...)'. Есть даже помощник, который поможет вам с * внешними данными * ... – Shnugo

ответ

1

Лучший способ - не запускать скрипт через сервер sql. Основными причинами являются безопасность, обработка ошибок и простое администрирование (например, если вы хотите запустить только одну часть).

Вы должны попытаться получить данные из базы данных из своего приложения (в вашем примере это xlsx-файл - это не простая процедура запуска из sql-сервера programaticaly). Если он должен быть запланирован, чем использовать агент заданий или планировщик задач (одно задание/задача с большим количеством деталей) или создать пакет ssis или есть методы с помощью связанного сервера/openrowset, как напрямую записывать данные в excel.

Но когда вы используете соответствующую обработку ошибок, она также может быть в xp_cmdshell.

Смежные вопросы