Как вызвать задание в агенте SQL Server из приложения Windows

Я назначил задание xyz в Агент задания SQL Server. Теперь я хочу вызвать эту работу из моего приложения Windows.

Ответ 1

Сделайте вызов sp_start_job.

exec msdb.dbo.sp_start_job @job_name = 'YourJobName'

Ссылка MSDN на sp_start_job

SqlConnection DbConn = new SqlConnection(YourConnectionString);
SqlCommand ExecJob = new SqlCommand();
ExecJob.CommandType = CommandType.StoredProcedure;
ExecJob.CommandText = "msdb.dbo.sp_start_job";
ExecJob.Parameters.AddWithValue("@job_name", "YourJobName")
ExecJob.Connection = DbConn; //assign the connection to the command.

using (DbConn)
{
    DbConn.Open();
    using (ExecJob)
    {
        ExecJob.ExecuteNonQuery();
    }
}

Ответ 2

Задания агента - это, как правило, просто скрипты, которые в любом случае выполняют запросы. Есть ли какая-то причина, по которой вы не можете просто запустить запрос, в котором все-таки выполняется работа агента?

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

Ответ 4

Метод использования sp_start_job работает, но он сталкивается с проблемой, заключающейся в том, что вы точно не знаете, когда работа закончится. Метод вернется сразу после вызова, а не после его завершения. Если это важно для вас, здесь есть функция, использующая объекты управления SQL Server (SMO), которая будет возвращаться только после завершения задания. Вам нужно будет добавить ссылки на следующие классы:

Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlEnum 
Microsoft.SqlServer.ConnectionInfo

Вот код:

Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Common
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Smo.Agent

public void RunSQLAgentJob(string JobName)
{
    SqlConnection DbConn = new SqlConnection(connectionstring);
    ServerConnection conn;
    Job job;
    Server server;

    using (DbConn) {
        conn = new ServerConnection(DbConn);
        server = new Server(conn);
        job = server.JobServer.Jobs(JobName);
        // make sure it not already running before starting it
        if (job.CurrentRunStatus == JobExecutionStatus.Idle) 
            job.Start();
        while (job.CurrentRunStatus == JobExecutionStatus.Executing) {
            job.Refresh();
            Console.WriteLine($"Current status of {JobName} is {job.CurrentRunStatus.ToString}");
            System.Threading.Thread.Sleep(3000);
        }
    }
}