Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запуск vbs из процедуры  [new]
sonwookong
Member

Откуда:
Сообщений: 8
Здравствуйте,

Задача: загружать в sql-сервер данные из екселя. книги имеют несколько листов с разными названиями. Не смог найти решения как программно t-sql-ем перебрать все листы в книге.

Для этого сделал vbs-скрипт, который рассыпает листы в книге на отдельные файлы.

+
Option Explicit

dim fso,xls,tSheet
dim file,files, inFil
dim fName
dim tDIR


on error resume next
tDIR="\\s\t\"
Set fso = CreateObject("Scripting.FileSystemObject")
set xls=CreateObject("Excel.Application")
xls.visible=true
if not fso.FolderExists(tDIR & "ok") then
fso.CreateFolder tDIR & "ok"
end if
set files = fso.GetFolder(tDIR).Files
For Each file In files
set inFil=xls.Workbooks.Open(file)
For Each tSheet In inFil.Worksheets
fName= tSheet.name & "_" & file.name
tSheet.copy
xls.ActiveWorkbook.sheets(1).name="1"
xls.ActiveWorkbook.Close true, tDIR & fName
next
inFil.close
if fso.FileExists(tDIR & "ok\" & file.name) Then
fso.deletefile tDIR & "ok\" & file.name, 1
end if
file.move tDIR & "ok\"
next
Set files = Nothing
Set fso = Nothing


скрипт запускаю xp_cmdshell-ом

он спотыкается на строчке set inFil=xls.Workbooks.Open(file) (открывает файл екселя) с ошибкой:
автор
1004: Нет доступа к файлу '\\s\t\ОвощиАВР.xlsx'. Это может быть вызвано одной из следующих причин.
• Имени файла или пути не существует.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем открытой в данный момент книги.


- Если запускать скрипт из проводника все работает как надо.
- доступ у Системы к этому файлу есть, он лежит на том-же компьютере где крутится sql-сервер. изменение пути на локальный c:\t\ОвощиАВР.xlsx не помогает
- пробовали запускать скрипт из sql-процедуры так, чтобы он работал от конкретного пользователя а не от системы - та-же ошибка.

Помогите, люди добрые, разобраться с этой проблемой.
25 фев 15, 18:53    [17312071]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
user89
Member

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

как один из вариантов - делать все манипуляции с SQL базой внутри VBS скрипта. Там ничего сложного нет
Мне в своё время хорошо помогла эта статья с примерами http://www.script-coding.com/ADO.html
26 фев 15, 09:32    [17313681]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
sonwookong
пробовали запускать скрипт из sql-процедуры так, чтобы он работал от конкретного пользователя

и как это выглядело ?
26 фев 15, 12:34    [17314854]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2517
1. Заменить сетевые пути на локальные.
2. Дать полные права на папку с файлами для той учетной записи, из-под которой запущен SQL Server.
3. Зайти на сервер под этой локальной учетной записью и запустить Excel. Возможно Excel требует каких-то одноразовых действий от пользователя при своем первом запуске.
26 фев 15, 17:41    [17317260]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
sonwookong, мастер импорта поможет.
27 фев 15, 11:42    [17320039]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
sonwookong
Member

Откуда:
Сообщений: 8
Александр Спелицин
1. Заменить сетевые пути на локальные.
2. Дать полные права на папку с файлами для той учетной записи, из-под которой запущен SQL Server.
3. Зайти на сервер под этой локальной учетной записью и запустить Excel. Возможно Excel требует каких-то одноразовых действий от пользователя при своем первом запуске.


1. не помогает
2. sql-сервер работает от Система к папке имеет полный доступ.
3. Системой зайти невозможно.
28 фев 15, 09:58    [17324791]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
sonwookong
Member

Откуда:
Сообщений: 8
Владислав Колосов,

Процедура, из которой запускается скрипт, толкается внутри пользовательской программы Оператором.
Пересадить Оператора на мастер импорта не реально.
28 фев 15, 10:05    [17324798]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
sonwookong, тогда не ясно в чем проблема - импортировать должно пользовательское приложение, а не сервер.
28 фев 15, 13:35    [17325287]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
В любом случае мастером импорта можно подготовить SSIS пакеты, а пользователь сможет их выполнить тем или иным способом. Или сделайте загрузку по расписанию
28 фев 15, 13:37    [17325297]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
sonwookong
от Система к папке имеет полный доступ.

это вы как то установили ? или просто так думаете ?
28 фев 15, 14:17    [17325440]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
sonwookong
Member

Откуда:
Сообщений: 8
Glory,
посмотрел вкладку Безопасность у папки и у файлов.

По Вашему предыдущему вопросу "как запустили от имени другого пользователя". Это как-то сделал мой сисадмин. Я только видел в диспетчере задач, что скрипт работает не от Системы а от учетки Администратора.
Я его попросил дать ответ на Ваш вопрос - должен в ближайшее время ответить.
28 фев 15, 17:06    [17325943]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
sonwookong
Member

Откуда:
Сообщений: 8
В дебагере сравнил свойства Validator с нормальным списком и с однострочным - все свойства идентичны.
28 фев 15, 17:19    [17325968]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
sonwookong
Member

Откуда:
Сообщений: 8
ой. предыдущий пост не в тему. извините!!!
28 фев 15, 17:21    [17325970]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Loofi
Member

Откуда:
Сообщений: 41
Glory
sonwookong
пробовали запускать скрипт из sql-процедуры так, чтобы он работал от конкретного пользователя

и как это выглядело ?

вариант 1. скрипт с psexec
вариант 2. скрипт с runas
вариант 3. с помощью sp_xp_cmdshell_proxy_account
во всех 3х случаях vbs выполнялся от имени нужного пользователя, но замирал после создания процесса excel.exe.
1 мар 15, 00:18    [17326952]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
DisplayAlerts
Guest
Loofi
Glory
пропущено...

и как это выглядело ?

вариант 1. скрипт с psexec
вариант 2. скрипт с runas
вариант 3. с помощью sp_xp_cmdshell_proxy_account
во всех 3х случаях vbs выполнялся от имени нужного пользователя, но замирал после создания процесса excel.exe.
вы, типа, вместо ТСа ?
он другое говорил: "спотыкается на строчке set inFil=xls.Workbooks.Open(file)"

может какой-то Алерт от Экселя не даёт дальше "двигать"?
правда, с этим - xls.visible=true , вы его должны были увидеть
но, навсякий
xls.DisplayAlerts = False
1 мар 15, 00:43    [17327023]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
sonwookong
Glory,
посмотрел вкладку Безопасность у папки и у файлов.

И вы там увидели, что ваш скрипт обращается к этой папке под учетной записью, имеющей нужные права ?

Loofi
вариант 1. скрипт с psexec
вариант 2. скрипт с runas
вариант 3. с помощью sp_xp_cmdshell_proxy_account
во всех 3х случаях vbs выполнялся от имени нужного пользователя, но замирал после создания процесса excel.exe.

А где тут собственно код на TSQL?
И как вы проверяли учетную запись внутри запущенного вами скрипта ?
И почему "замирал", если изначально "он спотыкается на строчке set inFil=xls.Workbooks.Open(file) (открывает файл екселя) с ошибкой: " ?
1 мар 15, 15:26    [17328188]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Loofi
Member

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

ТС говорит с точки зрения разработчика, я с точки зрения - админа.
он говорил: "спотыкается на строчке set inFil=xls.Workbooks.Open(file)", и ,если я правильно понимаю, в результате создается процесс excel.exe.

xls.DisplayAlerts = False пробовал - не помогло.
1 мар 15, 20:22    [17329065]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Loofi
Member

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

код на TSQL прост, как железная дорога
xp_cmdshell 'c:\path\to\scrip.bat'

учетная запись под которой выполняется скрипт видна в диспетчере задач
"замирал" - т.к. создается процесс excel.exe и вместе с процессом выполнения скрипта они не завершаются, даже когда в конце vbs добавил WScript.Quit
1 мар 15, 20:38    [17329113]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Loofi
учетная запись под которой выполняется скрипт видна в диспетчере задач
"замирал" - т.к. создается процесс excel.exe и вместе с процессом выполнения скрипта они не завершаются, даже когда в конце vbs добавил WScript.Quit

А вы в курсе, какие настройки безопасности нужны учетной записи службы для работы с десктопными приложениями ?
Вы логинились на на консоль сервера под этой учетной записью и запускали ващ скрипт интереактивно, да еще из той же самого каталога, что это делает сервер ?
2 мар 15, 09:08    [17330020]     Ответить | Цитировать Сообщить модератору
 Re: Запуск vbs из процедуры  [new]
DisplayAlerts
Guest
Loofi,

у меня код, из сабжевого поста, нормально отрабатывает и при запуске из SSMS через xp_cmdshell 'C:\Temp\test.vbs'
разве только добавьте в конце скрипта
xls.Quit
set xls = Nothing

а то "неаккуратненько" (но скрипт работал и без этого, и процесс Экселя закрывался)
правда юзер - локальный админ

автор
Не смог найти решения как программно t-sql-ем перебрать все листы в книге.

если проблема только в этом, то может лучше поменять подход ?
список листов в книге можно через ОЛЕ получить

declare @hr int
declare @cn int
declare @connectionString varchar(1000)
declare @rs int
declare @fld int
declare @eof int
declare @TabName varchar(100)
----------------------------

--set @connectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\t\ok\Лист Microsoft Excel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";'
set @connectionString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\temp\t\ok\Лист Microsoft Excel.xls;Extended Properties="Excel 12.0 Xml;HDR=YES";'

exec @hr = sp_OACreate 'ADODB.Connection', @cn output
exec @hr = sp_OAMethod @cn, 'Open', null, @connectionString
exec @hr = sp_OAMethod @cn, 'OpenSchema', @rs output, 20
exec @hr = sp_OAGetProperty @rs, 'Fields', @fld output, 'TABLE_NAME'

exec @hr = sp_OAGetProperty @rs, 'EOF', @eof output
while @eof=0
begin
	exec @hr = sp_OAMethod @fld, 'Value', @TabName output
	print @TabName
	---------------
	exec @hr = sp_OAMethod @rs, 'MoveNext'
	exec @hr = sp_OAGetProperty @rs, 'EOF', @eof output
end

----------------------------
exec @hr = sp_OAMethod @rs, 'Close'
exec @hr = sp_OAMethod @cn, 'Close'

exec @hr = sp_OADestroy @fld
exec @hr = sp_OADestroy @rs
exec @hr = sp_OADestroy @cn
2 мар 15, 13:01    [17331233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить