寫程式呼叫 SQL Agent 底下的作業(Jobs)
出處: https://dotblogs.com.tw/hunterpo/2010/06/29/16269
寫程式呼叫 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":
接著就是寫個簡單的範例,這邊是寫 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);
}
程式很單純,僅在頁面上配置一個按鈕,點一下就執行呼叫預存程序,有幾個地方要說明:
- 連線字串中 Initial Catalog(Database)的值在本例不是那麼重要,但登入帳號必須具有足夠的權限,請參考:sp_start_job (Transact-SQL) 中的「權限」小節。
- @job_name 這個參數的資料型態是 sysname,本質上可以用 NVARCHAR(128) 代替,這個可以參考:使用特殊資料型態 中的「sysname」小節。
跑起來的效果會像這樣:
當然備份路徑也會看到產生一個 AdventureWorks.bak 備份檔:
很簡單的程式,整理給有需要的人囉!