web-dev-qa-db-ja.com

WindowsアプリケーションからSQL Serverエージェントでジョブを呼び出す方法

SQL Serverジョブエージェントでジョブxyzをスケジュールしました。次に、Windowsアプリケーションからジョブを呼び出します。

21
user824910

sp_start_jobを呼び出します。

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

sp_start_jobのMSDNリファレンス

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

エージェントジョブは通常、とにかくクエリを実行する単なるスクリプトです。とにかく、エージェントジョブが実行しているクエリを実行できない理由はありますか?

エージェントは、スケジューリングや障害通知などを処理するだけです。これは少し単純化されすぎていますが、エージェントは、クエリを実行するアラートを備えたスケジューラです。エージェントジョブをスクリプト化して、エージェントとアプリの両方で実行されるストアドプロシージャに移動できるかどうかを確認します。

2
Gats

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

documentation はすべてのオプションを説明します。 TSQLを使用しない場合は、C#または別の.NET言語から SMOジョブクラス を使用できます。

2
Pondlife
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
Kaarthikeyan