web-dev-qa-db-fra.com

Comment appeler le travail dans l'agent SQL Server à partir d'une application Windows

J'ai planifié un travail xyz dans l'agent de travail SQL Server. Maintenant, je veux appeler le travail à partir de mon application Windows.

17
user824910

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();
    }
}
24
user596075

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.

1
Gats

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.

1
Pondlife
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/

0
Kaarthikeyan

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);
        }
    }
}
0
Avi