Я назначил задание xyz
в Агент задания SQL Server. Теперь я хочу вызвать эту работу из моего приложения Windows.
Как вызвать задание в агенте SQL Server из приложения Windows
Ответ 1
Сделайте вызов sp_start_job
.
exec msdb.dbo.sp_start_job @job_name = 'YourJobName'
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
Задания агента - это, как правило, просто скрипты, которые в любом случае выполняют запросы. Есть ли какая-то причина, по которой вы не можете просто запустить запрос, в котором все-таки выполняется работа агента?
Агент просто обрабатывает уведомления о расписании и сбое и т.д. Это немного упрощает, но агент в основном представляет собой планировщик с предупреждениями, в которых выполняются запросы. Попробуйте выполнить скриптовое задание агента и посмотреть, может ли он переходить к хранимой процедуре, выполняемой как агентом, так и вашим приложением.
Ответ 3
В документации описаны все параметры. Вы можете использовать класс SMO Job из С# или другого языка .NET, если вы предпочитаете не использовать TSQL.
Ответ 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);
}
}
}
Ответ 5
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/