我写了个大型的软件,其中有SQL后台任务自动执行指定的任务。为方便安装和管理SQL后台任务(比如任务执行的时间),希望能在自己写的程序中建立和管理SQL后台任务。我曾经在自己写的程序中建立过SQL存储过程(SQL脚本保存在TXT文件中,在程序读入并执行),但用同样的办法无法建立SQL后台任务,更没办法管理后台任务。请高手出招,谢谢!!

解决方案 »

  1.   

    TO ZHAO_YANG:
      对,就是JOB!有什么好办法??
      

  2.   

    使用作业,即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) 來控制複寫作業步驟。
      

  3.   

    谢谢楼上,看了有点复杂!!实际上我一直是这样用的:在自己的计算机上建立需要的作业(job),然后生成SQL脚本,到用户现场后在查询分析器中打开并执行脚本建立用户需要的JOB。 现在我需要的是在我自己编写的程序中实现用户需要的JOB的建立,并管理它(比如改变JOB执行时间等)。这样的话就不需要用户熟悉查询分析器和企业管理器的使用方法。请注意我前面的问题和目的描述!!!谢谢!
      

  4.   

    实际上我一直是这样用的:在自己的计算机上建立需要的作业(job),然后生成SQL脚本,到用户现场后在查询分析器中打开并执行脚本建立用户需要的JOB。 现在我需要的是在我自己编写的程序中实现用户需要的JOB的建立,并管理它(比如改变JOB执行时间等)。这样的话就不需要用户熟悉查询分析器和企业管理器的使用方法。请注意我前面的问题和目的描述!!!谢谢!
    ---------------------
    有难度,,,
    待高手,,,
      

  5.   

    我们公司系统,就试自己搞了一个作业(类似sql作业),,,自己可以修订,,
      

  6.   

    下面是建立一个作业的代码,作业的功能是定时执行一个存储过程,搂主可以参考下BEGIN TRANSACTION            
      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          
      

  7.   

    13楼:是的,手工建立JOB后,可以生成你说的脚本!!!
       但是我需要的是反过来:又用这个脚本在自己的程序中(我用DELPHI)生成JOB,并在自己的程序中管理他们。可以我没实现。在查询分析其中可以做到。