SQL Server- VBScript: VBScript открыть файл Excel не удалось в задании SQL?

В отношении vbScript открывает Excel, но не загружает макрос / модули?

Теперь я попытался запустить мой VBScript из SQL Job. Хотя я успешно выполнил задание, он не открыл мой файл Excel (Checked Task Scheduler). Я пошел посмотреть историю для этой работы и нашел

Сообщение выполнено от имени пользователя: GSOPS4\SYSTEM. Microsoft (R) Windows Script Host версии 5.7 Copyright (C) Microsoft Corporation. Все права защищены.C:\WINDOWS\system32\TestTOPTMay307.vbs(5, 1) Microsoft Excel: Microsoft Excel не может получить доступ к файлу '\gsops4\data_extracts\TestTOPTMay307.xlsm'. Есть несколько возможных причин: Имя файла или путь не существует. Файл используется другой программой. Книга, которую вы пытаетесь сохранить, имеет то же имя, что и текущая открытая книга. Код завершения процесса 0. Шаг успешно выполнен.

Я также следовал советам в этой теме. Запустить консольное приложение C# из агента SQL Server (задание)?

Однако я не мог заставить его работать. Эта вещь раздражала меня последние 48 часов. Будем весьма благодарны за любые подсказки о том, что их вызывает и как мне успешно выполнить свою работу (запустить файл vbscript из SQL). Спасибо всем в Adv!

Какие-нибудь мысли?

1 ответ

Решение

Альтернативный взгляд

Excel очень хорошо показывает диалоговые окна на консоли и затем зависает, пока пользователь не выполнит действие. Это очень плохая вещь на сервере, так как это приведет к зависанию процесса и утечке запущенных экземпляров Excel. Это также требует, чтобы у вас был установлен Excel на самом сервере.

Как правило, было бы гораздо лучше планировать задание SSIS через агента, который считывает электронную таблицу через драйвер OLEDB, а затем реплицирует вычисление на задание на стороне сервера. Что именно делает макрос?

В свое время я выполнил несколько заданий ETL из источников Excel, и (IMO) лучший способ работать с данными вне Excel - это избегать вызова EXCEL.EXE любой ценой. Это очень привередливый к висящим ссылкам COM, поэтому вы должны быть очень осторожны с удалением всех созданных объектов COM. В некоторых случаях ссылки по умолчанию ("Рабочий лист", "Рабочая книга", "Диапазон" и т. Д.) Создают непрозрачные ссылки за кулисами, которые фактически невозможно привести в порядок программно, поскольку библиотека типов не предоставляет никаких средств для этого.

Первичные сборки взаимодействия.NET добавляют дополнительные сложности к этому, поскольку они генерируют свои собственные ссылки, которые также должны быть явно убраны. Существует существенное несоответствие импеданса между COM и.Net - в том смысле, что было написано несколько книг о том, как компоненты COM и.Net хорошо работают вместе.

К счастью, WSH не включает.Net, но удаленное взаимодействие COM на COM-серверах Excel - это не то, что я бы рекомендовал делать из СУБД.

Два гораздо более безопасных подхода

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

  2. Распакуйте ZIP-файл.xlsx и извлеките из него рабочие листы - это на самом деле работает лучше, чем вы думаете. sheetxx.xml файлы в довольно простом формате, и единственное, что вам может понадобиться sharedStrings.xml, Как правило, вам не нужно делать это с SQL Server, если у вас есть доступный SSIS, но это довольно полезный прием, если вы работаете с (скажем) Oracle на хосте, отличном от Windows.

РЕДАКТИРОВАТЬ: чтобы использовать Excel через OLE-автоматизацию, вам нужно установить Excel на компьютере, на котором он запущен. Как правило, не стоит устанавливать Excel на сервер, так как он не особенно безопасен. Это также инструмент для рабочего стола, который имеет тенденцию пропускать ссылки COM и запускать экземпляры Excel, если вы не ставите точки над своими I и пересекаете свои T с созданием и удалением ссылок на COM.

SSIS имеет источник данных Excel. Вы можете увидеть это, создав проект SSIS в BIDS и создав новый менеджер соединений. Одним из ваших вариантов будет Excel.

Тем не менее, если вам нужно запросить список sharepoint, лучше запросить его программно, вообще не используя Excel. Немного гугл-фу должно привести несколько примеров того, как это сделать, например, здесь., Это можно сделать с помощью отдельного приложения.Net или задачи сценария в пакете служб SSIS (задачи сценария - это пользовательские задачи.Net, которые можно создавать в пакете служб SSIS).

Если вы сделаете это, вам, вероятно, лучше разработать его вне SSIS (используйте Visual C# Express, если у вас нет других вариантов), а затем перенести его на задачу сценария. Если вы знакомы с Python, IronPython или Boo - отличные инструменты для интерактивной работы с API.Net, чтобы что-то заработало.

Другие вопросы по тегам