我写了个大型的软件,其中有SQL后台任务自动执行指定的任务。为方便安装和管理SQL后台任务(比如任务执行的时间),希望能在自己写的程序中建立和管理SQL后台任务。我曾经在自己写的程序中建立过SQL存储过程(SQL脚本保存在TXT文件中,在程序读入并执行),但用同样的办法无法建立SQL后台任务,更没办法管理后台任务。请高手出招,谢谢!!
解决方案 »
- 我想用delphi为vb开发组件,希望有这方面经验的哥们交流一下
- 靠,WISE打包的BDE竟然毫无作用!
- 请问InstallSheild怎样在开始菜单中加入卸载
- 这段代码什么意思 急
- 新手在看例子时遇到不明白,请各位指教
- spcomm从收到最后一个字符到触发onreceivedata()为什么要30多MS这么长?(intervaltimeout已设为2这么小)
- 怎么表示一个二进数?
- delphi中如何用FASTREPORT实现这样的表格?
- 有关ctrl+alt+del
- 怎样使自己的程序常驻内存
- 这些vb代码怎么转换成delphi?
- DELPHI引用控件StringGrid,如何进行[删除,修改],添加我会
对,就是JOB!有什么好办法??
详细查看SQLServer帮助。
或者自己写一个常驻内存的程序,类似作业了!
贴一段帮助(繁体的系统,没办法了)
建立作業步驟
作業步驟是作業在資料庫或伺服器上採取的動作,每個作業必須有至少一個作業步驟。作業步驟可以是作業系統指令、Transact-SQL 陳述式、Microsoft® ActiveX® Script 或複寫工作 (Replication Task)。CmdExec 作業步驟
CmdExec 作業步驟為作業系統指令或者以 .bat、.cmd、.com 或 .exe 結尾的可執行程式。當您建立一個 CmdExec 作業步驟時,您必須指定: 指令成功時傳回的處理序結束代碼。
CmdExec 指令,例如
C:\Program Files\Microsoft SQL Server\80\Tools\Binn\Osql.exe\E\Q "sp_who".
到所有可執行檔的完整路徑。
若要建立 CmdExec 作業步驟Enterprise ManagerTransact-SQLSQL-DMO若要重設 SQLAgentCmdExec 使用權限Enterprise ManagerTransact-SQL 作業步驟
當您建立一個 Transact-SQL 作業步驟時,您必須: 確認要在其中執行作業的資料庫。
撰寫 Transact-SQL 陳述式 (Statement)、預存程序 (Stored Procedure) 或延伸預存程序 (Extended Stored Procedure)。
(選擇性) 您可以開啟一個現存的 Transact-SQL 檔作為該作業步驟的指令。sysadmin 角色的成員可以撰寫作業步驟,在另一個資料庫使用者的內容中執行。例如,系統管理員可以在代表另一個資料庫使用者的 pubs 資料庫中執行一個建立資料庫物件的作業。附註 一個單一的 Transact-SQL 作業步驟可能含有多個批次處理。Transact-SQL 作業步驟可能含有內嵌的 GO 指令,例如 osql.exe。
若要建立 Transact-SQL 作業步驟Enterprise ManagerTransact-SQLSQL-DMO若要定義 Transact-SQL 作業步驟選項Enterprise ManagerSQL-DMOActive Scripting 作業步驟
建立 ActiveX Scripting 作業步驟時,您必須: 確認撰寫作業步驟所用的指令碼語言。
撰寫 ActiveX Script。
您也可以開啟一個現存的 ActiveX Script 檔作為該作業步驟的指令。ActiveX Script 指令可以改為外部編譯 (例如,使用 Microsoft Visual Basic®),然後當成 CmdExec 可執行檔執行。當作業步驟指令是一個 ActiveX Script 時,您可以使用 SQLActiveScriptHost 物件將輸出列印到作業步驟歷程記錄,或者是建立 COM 物件。SQLActiveScriptHost 是一個全域物件,由「SQL Server 代理程式」裝載系統導入到指令碼名稱空間中。這個物件有兩個方法 (PrintObject 與 CreateObject)。以下範例示範 ActiveX 編寫指令碼在 Visual Basic Scripting Edition (VBScript) 與 PerlScript 中的運作方式。Rem VBScript job step example:
Sub main()
Set DMOServer = CreateObject("SQLDMO.SQLServer")
DMOServer.LoginSecure = True
DMOServer.Connect "myserver"
Print DMOServer.Name
DMOServer.Disconnect
Set DMOServer = Nothing
End Sub#PerlScript job step example:
Sub main()
{
$DMOServer = $SQLActiveScriptHost->CreateObject("SQLDMO.SQLServer");
$DMOServer->Connect("myserver", "sa");
$SQLActiveScriptHost->Print($DMOServer->Name);
$DMOServer->Disconnect();
$DMOServer = undef;
}若要建立 ActiveX Script 作業步驟Enterprise ManagerTransact-SQLSQL-DMO複寫作業步驟
當您使用複寫 (Replication) 建立發行集 (Publication) 時,會自動建立複寫作業。複寫的類型 (快照式 (Snapshout)、交易式 (Tansactional) 或合併式 (Merge)) 與所使用的選項決定建立的作業類型。複寫作業步驟會執行以下複寫代理程式之一: 散發代理程式 (Distribution Agent) (散發作業)
記錄讀取器代理程式 (Log Reader Agent) (LogReader 作業)
合併代理程式 (Merge Agent) (合併作業)
佇列助讀員代理程式 (Queue Reader Agent) (QueueReader 作業)
快照集代理程式 (Snapshot Agent) (快照集作業)
設定複寫時,複寫代理程式可以在啟動「SQL Server 代理程式」啟動後持續執行,或視需要執行,也可以根據排程來執行。 附註 建議您使用「複寫監視器」(Replication Monitor) 來控制複寫作業步驟。
---------------------
有难度,,,
待高手,,,
DECLARE @NAME NVARCHAR(80)
SET @NAME=N'DB_2007'
IF ISNULL(@NAME,'')=''
SET @NAME=DB_NAME()
DECLARE @SRVNAME NVARCHAR(80)
SET @SRVNAME=@@SERVERNAME
IF @SRVNAME IS NULL
SET @SRVNAME=N'MJX2' DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0 IF EXISTS (
SELECT 1 FROM MSDB..SYSJOBS WHERE NAME=N'PO'
)
BEGIN
SELECT @jobid=job_id FROM MSDB..SYSJOBS WHERE NAME=N'PO'
exec @ReturnCode = msdb..sp_delete_job @jobid
SET @JOBID=NULL
END IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'PO', @enabled = 1, @owner_login_name = N'sa', @description = N'', @category_name = N'[Uncategorized (Local)]', @notify_level_eventlog = 2, @delete_level= 0
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'PO', @command = N'exec PR_PO', @database_name = @NAME, @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END
EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'PO', @enabled = 1, @freq_type = 4, @active_start_date = 20080519, @active_start_time = 235900, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = @SRVNAME, @automatic_post = 0
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END
SELECT @JobID
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
BEGIN
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
RETURN
END
COMMIT TRANSACTION
但是我需要的是反过来:又用这个脚本在自己的程序中(我用DELPHI)生成JOB,并在自己的程序中管理他们。可以我没实现。在查询分析其中可以做到。