寫程式呼叫 SQL Agent 底下的作業(Jobs)

寫程式呼叫 SQL Agent 底下的作業(Jobs)

SQL Server 有一支系統預存程序 sp_start_job,可以讓 SQL Agent 立即執行特定作業,因此只要透過 ADO.NET 與資料庫互動(不熟的朋友可參考這裡),給定適當的參數去叫用 sp_start_job 這支預存程序,就能達到用程式啟動 SQL Agent 作業,底下就為大家介紹如何完成這樣的需求。

為了示範,我先到 SQL Server Agent 底下新增一個作業(已經有的可用現有的作業,就請直接跳過這一段),命名為 "AdventureWorks_Job_DbBackup",主要內容是備份資料庫到本機的 "E:\DbBackup\AdventureWorks.bak":

Sql_Jobs

接著就是寫個簡單的範例,這邊是寫 ASP.NET 程式:
const string _SqlJobName = "AdventureWorks_Job_DbBackup";

protected void ExecSqlJobButton_Click(object sender, EventArgs e)
{
    string feedback = null;

    try
    {
        using (SqlConnection cn = new SqlConnection(
            ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand("[msdb].[dbo].[sp_start_job]", cn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@job_name", SqlDbType.NVarChar, 128).Value = _SqlJobName;

                // 接收回傳值
                SqlParameter rc = new SqlParameter("rc", SqlDbType.Int);
                rc.Direction = ParameterDirection.ReturnValue;
                cmd.Parameters.Add(rc);

                cn.Open();

                cmd.ExecuteNonQuery();

                feedback = String.Format(
                    "呼叫 SQL 排程 [{0}] {1}。",
                    _SqlJobName,
                    (int)rc.Value == 0 ? "成功" : "失敗");
            }
        }
    }
    catch (Exception ex)
    {
        feedback = String.Format(
            "呼叫 SQL 排程 [{0}] 發生例外:{1}",
            _SqlJobName,
            ex.Message).Replace("'", "");
    }

    ClientScript.RegisterStartupScript(GetType(), "_FEEDBACK", "alert('" + feedback + "');", true);
}

程式很單純,僅在頁面上配置一個按鈕,點一下就執行呼叫預存程序,有幾個地方要說明:
  1. 連線字串中 Initial Catalog(Database)的值在本例不是那麼重要,但登入帳號必須具有足夠的權限,請參考:sp_start_job (Transact-SQL) 中的「權限」小節。
  2. @job_name 這個參數的資料型態是 sysname,本質上可以用 NVARCHAR(128) 代替,這個可以參考:使用特殊資料型態 中的「sysname」小節。

跑起來的效果會像這樣:

Sql_Jobs_Exec

當然備份路徑也會看到產生一個 AdventureWorks.bak 備份檔:

Sql_Jobs_Bak

很簡單的程式,整理給有需要的人囉!