Запустить консольное приложение из SQL Server после запуска обновления таблицы асинхронно? - PullRequest
5 голосов
/ 27 декабря 2011

У меня проблемы с поиском наилучшего способа решения моей проблемы, имейте в виду, что я открыт для более эффективных способов решения этой задачи.

Что мне нужно сделать, так это то, что после обновления значения строки в моей таблице мне нужно использовать 2 поля из этой таблицы в качестве параметров для консольного приложения.Прямо сейчас я могу сделать это, установив триггер на таблицу и затем используя xp_cmdshell, чтобы запустить приложение с параметрами.Однако мне нужно сделать это асинхронно, чтобы моя хранимая процедура не зависала, ожидая завершения работы консольного приложения.

Возможно, я поступаю неправильно.

Я использую SQL Server 2008

РЕДАКТИРОВАТЬ - Ответ Андрея М, кажется, лучший в настоящее время, но какзаявил в комментариях мне нужен способ, чтобы это произошло "мгновенно".Можно ли назвать работу из SP или Trigger?или может быть другой способ добиться подобного результата?

спасибо за помощь всем.

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

Ответы [ 4 ]

5 голосов
/ 27 декабря 2011

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

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

1 голос
/ 28 декабря 2011

В вашем триггере поместите сообщение в очередь компонента Service Broker для каждой обновленной строки. Напишите хранимую процедуру, которая обрабатывает сообщения вне очереди. Установите хранимую процедуру в качестве хранимой процедуры активации для очереди.

0 голосов
/ 27 декабря 2011

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

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

0 голосов
/ 27 декабря 2011

Я думаю, вам следует разработать расширенную хранимую процедуру (DLL) вместо вызова консольного приложения с использованием xp_cmd_shell.

...