Регистрировать состояние/время пакетного файла в SQL Server

Я хотел бы улучшить существующий файл bat, чтобы записывать продолжительность выполнения в таблицу SQL Server. Текущий bat-файл имеет одну строку, которая вызывает утилиту командной строки.

Я думал, что буду использовать что-то вроде этого, операторы SQL в пакетном файле Windows. Псевдокод:

StartTime = Now()
hyperioncommandlineshell.cmd /a:parm1 /b:parm2 /c:parm3
sqlcmd.exe -b -S myhost -E -d mydatabase -Q "Insert Into MyTable Values (Current_Timestamp, 'MyProcess', Now() - StartTime)" -W    

Некоторые вопросы:

  1. Сервер, на котором работает этот файл bat, не имеет инструментов SQL, и я вижу из этот пост о том, что он требует установки (вы не можете просто скопировать файл sqlcmd.exe). Это встретит сопротивление. Есть ли другой способ выполнить оператор SQL из пакетного файла без установки программного обеспечения?

  2. У меня нет опыта работы с BAT-файлами. Может ли кто-нибудь дать рекомендации о том, как получить продолжительность процесса (например, захватить время начала и вычислить разницу в конце)?

Я бы, вероятно, попробовал использовать другой инструмент, с которым я более знаком, но я пытаюсь сделать это в bat, чтобы изменение затрагивало только один существующий объект и не требовало дополнительных объектов.


person user1886039    schedule 07.12.2012    source источник
comment
Сначала вам нужно устранить сопротивление: вы ничего не упомянули о ваших версиях SQL Server или Windows или о том, почему sqlcmd.exe не разрешен, но суть в том, что вы не можете подключиться к SQL Server без клиентских библиотек и вы не можете выполнить сценарий SQL без какого-либо инструмента. Вы можете написать свой собственный инструмент для запуска SQL-скрипты, но это кажется бессмысленным и более рискованным, чем использование sqlcmd.exe.   -  person Pondlife    schedule 07.12.2012


Ответы (1)


Компьютеры Windows поставляются с уже установленными драйверами ODBC, поэтому у вас, вероятно, есть драйвер ODBC для SQL Server. Если это так, то вы можете получить утилиту Microsoft osql для запуска операторов T-SQL из DOS. Вот документы для него в MSDN:

http://msdn.microsoft.com/en-us/library/aa214012(v=SQL.80).aspx

Он был разработан для SQL Server 2000, поэтому могут возникнуть проблемы с подключением к более поздним версиям SQL Server, но попробовать стоит. Если это работает, вам не нужно будет устанавливать ничего особенного для подключения к вашему SQL-серверу (хотя вам может потребоваться создать имя источника данных ODBC для сервера...). В Windows Vista+ нажмите Пуск и введите ODBC, чтобы открыть редактор источников данных ODBC.

Использование SQLCMD потребует от вас установки собственного клиента или, по крайней мере, SNAC (тема обсуждения: http://us.generation-nt.com/answer/how-install-only-sqlcmd-exe-utility-help-87134732.html), чтобы просто запустите SQLCMD без установки всего Native Client (однако SNAC все же необходимо установить). Я раньше не слышал о SNAC, так что это потребует небольшого исследования. Я предполагаю, что установка чего-либо будет встречена с таким же сопротивлением, поэтому, если вы сможете преодолеть это сопротивление, установка собственного клиента, вероятно, будет вашим лучшим выбором.

Что касается прошедшего времени. Вы можете использовать %DATE% %TIME% для получения текущей даты/времени. Таким образом, вы можете использовать что-то вроде следующего, чтобы зафиксировать время начала, запустить свой процесс, а затем зафиксировать время окончания - опубликовать их все в базе данных:

set StartTime=%DATE% %TIME%
hyperioncommandlineshell.cmd /a:parm1 /b:parm2 /c:parm3
set EndTime=%DATE% %TIME%
sqlcmd.exe -b -S myhost -E -d mydatabase -Q "Insert Into MyTable Values ('%StartTime%', 'MyProcess', '%EndTime%')" -W 

Вы не сможете выполнить вычисления StartTime - EndTime в самой DOS, но вы можете сохранить время начала и окончания в таблице и использовать для этого SQL.

Формат %DATE% и %TIME% основан на формате, на использование которого настроена машина. Вы можете ввести echo %DATE% %TIME% в командной строке DOS, чтобы увидеть, как он отформатирован для вас. Скорее всего, вам придется хранить эти значения в полях varchar, поскольку формат может не преобразовываться автоматически в значение datetime. Если он конвертируется автоматически, то вы можете выполнить вычисления в операторе SQL из DOS, например:

sqlcmd.exe -b -S myhost -E -d mydatabase -Q "Insert Into MyTable Values ('%EndTime%' - '%StartTime%', 'MyProcess')" -W

(К вашему сведению, я использовал ваш псевдокод для всех примеров, поэтому ничего не тестировалось.)

person James L.    schedule 07.12.2012
comment
Можете ли вы скопировать только osql.exe на сервер — это юридический вопрос, а не технический. Я не знаю, разрешает ли Microsoft распространять его отдельно или в комплекте с пользовательским приложением, или они требуют, чтобы вы установили полный клиент SQL Server. К сожалению, вопросы лицензирования часто довольно загадочны, но их все же необходимо учитывать. См. также этот вопрос, хотя, к сожалению, источник не указан. - person Pondlife; 08.12.2012
comment
Спасибо, Джеймс Л., это очень полезно. Когда я пошел искать утилиту osql, перенаправление на microsoft.com привело меня на страницу SSEUtil.exe. Эта утилита не требует установки, как и osql. Мой формат даты и времени — пятница 07.12.2012 15:45:07.96, который хорошо вставляется в поле данных даты и времени. Становимся ближе! - person user1886039; 08.12.2012