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

Откуда: (((@)))
Сообщений: 8564
Доброго дня всем!

Есть курсор, в котором запускается xp_cmdshell (вызов программы, которая выполняет некие действия и записывает информацию в таблицу - журнал). Смотрю таблицу и вижу, что момент запуска программы опережает момент предыдущего окончания:


line Action duration dateBegin RequestSendTime RequestResponceTime
line: 1 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:15 RequestResponceTime =09.10.2019 12:29:15
line: 2 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:16 RequestResponceTime =09.10.2019 12:29:17
line: 3 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:16 RequestResponceTime =09.10.2019 12:29:17
line: 4 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:16 RequestResponceTime =09.10.2019 12:29:17
line: 5 Action duration: dateBegin=09.10.2019 12:29:17 RequestSendTime =09.10.2019 12:29:18 RequestResponceTime =09.10.2019 12:29:18
line: 6 Action duration: dateBegin=09.10.2019 12:29:17 RequestSendTime =09.10.2019 12:29:18 RequestResponceTime =09.10.2019 12:29:18
line: 7 Action duration: dateBegin=09.10.2019 12:29:18 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:19
line: 8 Action duration: dateBegin=09.10.2019 12:29:18 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:19
line: 9 Action duration: dateBegin=09.10.2019 12:29:19 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:20
line:10 Action duration: dateBegin=09.10.2019 12:29:19 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:20


Т.е. В Line 3 и 4 записано, что начало выполнения программы для соответствующих итераций (12:29:15) началось раньше, чем закончилось исполнение программы на шаге 2 (12:29:17).
Обработка для Line 6 началась раньше чем закончилась обработка Line 5.
И т.п.

То есть получается множественный (я бы НЕ сказал многопоточный) одновременный запуск одного и того же внешнего приложения из курсора .

Где про это можно прочитать?
И как с этим бороться?

Правильно ли будет использовать задержку, например, на 3 секунды: WAITFOR DELAY '00:00:03'; ?


--------------------------
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) May 14 2014 18:34:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit)
9 окт 19, 13:12    [21990331]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
msLex
Member

Откуда:
Сообщений: 6674
SIMPLicity_
Доброго дня всем!

Есть курсор, в котором запускается xp_cmdshell (вызов программы, которая выполняет некие действия и записывает информацию в таблицу - журнал). Смотрю таблицу и вижу, что момент запуска программы опережает момент предыдущего окончания:


line Action duration dateBegin RequestSendTime RequestResponceTime
line: 1 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:15 RequestResponceTime =09.10.2019 12:29:15
line: 2 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:16 RequestResponceTime =09.10.2019 12:29:17
line: 3 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:16 RequestResponceTime =09.10.2019 12:29:17
line: 4 Action duration: dateBegin=09.10.2019 12:29:15 RequestSendTime =09.10.2019 12:29:16 RequestResponceTime =09.10.2019 12:29:17
line: 5 Action duration: dateBegin=09.10.2019 12:29:17 RequestSendTime =09.10.2019 12:29:18 RequestResponceTime =09.10.2019 12:29:18
line: 6 Action duration: dateBegin=09.10.2019 12:29:17 RequestSendTime =09.10.2019 12:29:18 RequestResponceTime =09.10.2019 12:29:18
line: 7 Action duration: dateBegin=09.10.2019 12:29:18 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:19
line: 8 Action duration: dateBegin=09.10.2019 12:29:18 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:19
line: 9 Action duration: dateBegin=09.10.2019 12:29:19 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:20
line:10 Action duration: dateBegin=09.10.2019 12:29:19 RequestSendTime =09.10.2019 12:29:19 RequestResponceTime =09.10.2019 12:29:20


Т.е. В Line 3 и 4 записано, что начало выполнения программы для соответствующих итераций (12:29:15) началось раньше, чем закончилось исполнение программы на шаге 2 (12:29:17).
Обработка для Line 6 началась раньше чем закончилась обработка Line 5.
И т.п.

То есть получается множественный (я бы НЕ сказал многопоточный) одновременный запуск одного и того же внешнего приложения из курсора Картинка с другого сайта. .

Где про это можно прочитать?
И как с этим бороться?

Правильно ли будет использовать задержку, например, на 3 секунды: WAITFOR DELAY '00:00:03'; ?


--------------------------
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) May 14 2014 18:34:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit)



xp_cmdshell - синхронный
xp_cmdshell работает синхронно. Управление не возвращается участнику до завершения команды ядра.


Либо ошибка в заполнении вашего лога
Либо ваш код выполняется в нескольких сессиях
9 окт 19, 13:17    [21990337]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36450
А, часом, там не xp_cmdshell 'start ...' написано?
9 окт 19, 13:18    [21990338]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8564
msLex, маловероятно. В лог фиксируется время запуска, время отправки запроса и время получения ответа от сервера. Эти данные вспомогательная программа сама кидает в лог (выполняется UPDATE таблицы лога с привязкой к полю, которое является первичным ключом этой таблицы).
9 окт 19, 13:26    [21990352]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8564
Гавриленко Сергей Алексеевич
А, часом, там не xp_cmdshell 'start ...' написано?

нет :
select @cmd = '"c:\myFolder\doSomething.exe" ' + 'confirm' + SPACE(1) + .... ' '; 
execute xp_cmdshell @cmd;
9 окт 19, 13:29    [21990355]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
msLex
Member

Откуда:
Сообщений: 6674
SIMPLicity_
Гавриленко Сергей Алексеевич
А, часом, там не xp_cmdshell 'start ...' написано?

нет :
select @cmd = '"c:\myFolder\doSomething.exe" ' + 'confirm' + SPACE(1) + .... ' '; 
execute xp_cmdshell @cmd;



Добавьте логирование в TSQL скрипт (обычный insert getdate() + @@spid + параметры до и после xp_cmdshell), и все сразу станет ясно
9 окт 19, 13:35    [21990365]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
Владислав Колосов
Member

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

это может быть из-за ошибки округления времени при записи в журнал.
9 окт 19, 13:35    [21990367]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
Владислав Колосов
Member

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

используйте тип datetime2.
9 окт 19, 13:36    [21990368]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запустить xp_cmdshell в курсоре?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8564
Владислав Колосов
SIMPLicity_,

используйте тип datetime2.


В журнал пишет утилита, C#, вставляется переменная, которая = DateTime.Now.ToString();
9 окт 19, 13:53    [21990398]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить