J'ai planifié un travail xyz
dans l'agent de travail SQL Server. Maintenant, je veux appeler le travail à partir de mon application Windows.
Appeler le sp_start_job
.
exec msdb.dbo.sp_start_job @job_name = 'YourJobName'
Référence MSDN sur 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();
}
}
Les tâches d'agent ne sont généralement que des scripts qui exécutent des requêtes. Y a-t-il une raison pour laquelle vous ne pouvez pas exécuter la requête exécutée par le travail d'agent de toute façon?
L'agent gère uniquement les notifications de planification et d'échec, etc. Ceci est un peu une simplification excessive, mais l'agent est principalement un planificateur avec des alertes qui exécute des requêtes. Essayez de créer un script pour votre travail d'agent et voyez si vous pouvez le transférer dans une procédure stockée exécutée à la fois par l'agent et votre application.
La documentation décrit toutes les options. Vous pouvez utiliser la classe SMO Job de C # ou un autre langage .NET si vous préférez ne pas utiliser TSQL.
using Microsoft.SqlServer.Management.Smo;
Server server = new Server("your_server_address");
server.JobServer.Jobs["job_name"]?.Start();
vous trouverez des exemples à: https://www.craftedforeveryone.com/start-stop-manage-ms-sql-server-agent-jobs-using-c-sharp/
La méthode d’utilisation de sp_start_job fonctionne, mais le problème est que vous ne savez pas exactement quand le travail est terminé. La méthode reviendra dès qu'elle sera appelée, pas quand elle sera terminée. Si cela est important pour vous, voici une fonction utilisant les objets SMO (SQL Server Management Objects) qui ne seront renvoyés que lorsque le travail sera terminé. Vous devrez ajouter des références aux classes suivantes:
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlEnum
Microsoft.SqlServer.ConnectionInfo
Voici le code:
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);
}
}
}