Запуск кода C# внутри задания агента SQL

У меня есть фрагмент кода, который нужно запускать каждый день в указанное время. Код прямо сейчас находится как часть моего веб-приложения. Есть 2 хранимые процедуры для получения/сохранения данных, которые использует код.

Как настроить Microsoft SQL Server Management Studio 2008 R2 для выполнения моего кода, а также сохраненных процедур в задании агента SQL. Я никогда не делал этого раньше и не могу найти документацию.


person Tom    schedule 11.07.2011    source источник


Ответы (3)


Самый простой способ — создать консольное приложение .NET, которое будет просто оболочкой для вашего реального кода, находящегося в DLL, веб-сервисе или где-то еще. Затем в задании агента SQL создайте шаг типа «Операционная система (CmdExec)», который вызывает ваше консольное приложение. Избавляет вас от хлопот, связанных с SSIS (и это одна из основных проблем, которых следует избегать). Я также согласен с @Hasanain в том, что процесс .NET может быть еще одной разумной альтернативой.

введите здесь описание изображения

Еще одно замечание. Агент SQL CmdExec будет искать целочисленный код возврата, поэтому ваш метод public static int Main(string args[]) {} должен возвращать 0 в случае успеха и некоторое отрицательное число в случае неудачи. Или, если вы сгенерируете исключение, это тоже будет работать нормально. И агент SQL будет регистрировать текст из того, что вы бросили, поскольку консольное приложение запишет его в stdout/stderr.

person mattmc3    schedule 11.07.2011
comment
Я не хотел идти по этому пути. Но я просто взял свой код из своего веб-приложения и создал консольное приложение. Теперь это может быть связано исключительно с моим приложением и позволит мне запускать его как CmdExec. - person Tom; 12.07.2011
comment
Я бы предложил иметь очень тонкое консольное приложение, а вместо этого иметь ваш фактический код в общей DLL или веб-службе. - person mattmc3; 02.01.2018

Вам следует прочитать об службах интеграции сервера Sql (SSIS). Затем вы можете запланировать пакеты SSIS, которые являются единицами функциональности sql. В пакете SSIS вы можете запускать задания сценариев и вызывать функции CLR (Common Language Runtime, то есть задания .Net) для выполнения вашего кода .net.

Одна вещь, однако, вы можете думать об этом немного в обратном направлении. Является ли основная причина использования SSIS для планирования выполнения кода, который вызывает какой-либо sql? Если это так, я бы рекомендовал вам изучить / использовать Windows Workflow Foundation (WWF). Это платформа .net для разработки и выполнения «долгосрочных» действий .net. На простом уровне вы можете думать об этом как об эквиваленте SSIS для программ .Net. Его можно встроить непосредственно в ваши приложения .Net без каких-либо знаний о SSIS сервера sql.

Наконец, если ваше приложение «очень» простое, вы можете подумать о том, чтобы просто обернуть вызовы обновления базы данных в простое консольное приложение. Таким образом, вы можете просто вызвать приложение через Планировщик заданий, встроенный в Windows для запуска в определенные дни/время и т. д.

person Brian Scott    schedule 11.07.2011

Вы можете создать хранимую процедуру .NET и добавить ее в SQL Server. Затем создайте задание агента SQL, которое будет вызывать эту новую хранимую процедуру.

Хранимая процедура .Net по существу должна быть ограничена небольшим набором библиотек .NET, которые уже встроены в SQL Server. Вы можете добавить свои собственные библиотеки DLL, чтобы обеспечить доступность всех необходимых функций. Однако, учитывая предупреждение от MS о том, что нет гарантии, что все пользовательские dll будут работать, для этого потребуется тщательное тестирование.

person Hasanain    schedule 11.07.2011
comment
@Hasnain: вы можете достаточно легко зарегистрировать любые зависимые библиотеки DLL в GAC, поэтому нет необходимости ограничивать область действия функции CLR. - person Brian Scott; 11.07.2011
comment
@Brian: Да, я знаю, что это можно сделать. Однако есть предупреждение от MS, что нет гарантии, что все кастомные dll будут работать, так что зависит от типа, ну и тестирования :). - person Hasanain; 11.07.2011