Как вызвать работу в агенте SQL Server из приложения Windows - PullRequest
19 голосов
/ 05 марта 2012

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

Ответы [ 5 ]

26 голосов
/ 05 марта 2012

Позвонить на 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 голосов
/ 05 марта 2012

Документация описывает все опции.Вы можете использовать SMO Job class из C # или другого языка .NET, если вы предпочитаете не использовать TSQL.

2 голосов
/ 05 марта 2012

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

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

1 голос
/ 18 января 2019
using Microsoft.SqlServer.Management.Smo;

Server server = new Server("your_server_address");
server.JobServer.Jobs["job_name"]?.Start();

примеры можно найти по адресу: https://www.craftedforeveryone.com/start-stop-manage-ms-sql-server-agent-jobs-using-c-sharp/

1 голос
/ 04 января 2019

Метод использования 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's 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...