SQL Serverジョブエージェントでジョブxyz
をスケジュールしました。次に、Windowsアプリケーションからジョブを呼び出します。
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();
}
}
エージェントジョブは通常、とにかくクエリを実行する単なるスクリプトです。とにかく、エージェントジョブが実行しているクエリを実行できない理由はありますか?
エージェントは、スケジューリングや障害通知などを処理するだけです。これは少し単純化されすぎていますが、エージェントは、クエリを実行するアラートを備えたスケジューラです。エージェントジョブをスクリプト化して、エージェントとアプリの両方で実行されるストアドプロシージャに移動できるかどうかを確認します。
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);
}
}
}
documentation はすべてのオプションを説明します。 TSQLを使用しない場合は、C#または別の.NET言語から SMOジョブクラス を使用できます。
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/