2009-11-04 101 views
23

如何在SQL Server Express Edition中每天在特定時間運行存儲過程?如何在SQL Server Express Edition中每天運行存儲過程?

注:

  • 這需要截斷審計表
  • 另一種方法是修改插入查詢,但是這可能是低效率的
  • 的SQL Server Express Edition不具備SQL Server代理

相關問題:

+0

這個職位看起來很有趣(在回答中引用到的相關問題之一): http://www.sqlteam.com/article/scheduling-jobs-in-sql-server-express – 2009-11-04 17:42:50

回答

0

你可以使用任務計劃觸發一個簡單的控制檯應用程序,將執行SQL語句。

4

如果您使用Express Edition,則需要使用Windows計劃程序或以某種方式連接到服務器的應用程序。

您將使用調度程序來運行sqlcmd。 Here are some instructions獲取sqlcmd與快遞版一起工作。

0

正如您已經正確指出的那樣,沒有代理進程,您需要其他服務器外部的其他內容,可能是您編寫和安裝的服務或Windows調度程序。

請注意,對於本地應用程序的快速安裝,可能機器在截斷表格時可能不打開(例如,您將其設置爲每天晚上在截止時間截斷,但用戶從不有他的機器)。

因此,您的計劃任務永遠不會運行,您的審計日誌會失去控制(這也是SQL Server代理的問題,但人們會認爲真正的服務器會不停地運行)。如果這種情況適合你的話,更好的策略可能是當應用程序檢測到自截斷以來已超過X天或者您的操作是否已經超過X天時,應用程序會按需執行此操作。

另一件需要注意的事情是,如果您正在討論Web應用程序,那麼應用程序加載時可能會有時間,並且該事件觸發時可能會執行操作。

正如在評論中提到的那樣,有sp_procoption - 這可能允許您的SP在每次引擎啓動時運行 - 此方法的缺點是對於長時間運行的實例,調用之間可能會有很長時間,如果在您需要執行操作的時候引擎未運行,它仍然存在問題。

+0

sp_procoption將允許存儲程序自動運行。 – 2009-11-20 09:46:49

8

我發現了以下機制爲我工作。

USE Master 
GO 

IF EXISTS(SELECT * 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID(N'[dbo].[MyBackgroundTask]') 
      AND type in (N'P', N'PC')) 
    DROP PROCEDURE [dbo].[MyBackgroundTask] 
GO 

CREATE PROCEDURE MyBackgroundTask 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- The interval between cleanup attempts 
    declare @timeToRun nvarchar(50) 
    set @timeToRun = '03:33:33' 

    while 1 = 1 
    begin 
     waitfor time @timeToRun 
     begin 
      execute [MyDatabaseName].[dbo].[MyDatabaseStoredProcedure]; 
     end 
    end 
END 
GO 

-- Run the procedure when the master database starts. 
sp_procoption @ProcName = 'MyBackgroundTask', 
       @OptionName = 'startup', 
       @OptionValue = 'on' 
GO 

一些注意事項:

  • 這是值得書寫的地方審計條目,以便您可以看到該查詢居然跑。
  • 服務器需要重新啓動一次以確保腳本第一次運行。
+0

與審計線索的同時,我會添加到存儲過程的工藝歷史的檢驗,這樣,如果沒有在24小時或任何運行 - 繼續前進,在啓動時運行的進程。這將處理機器在夜間或偶爾夜間或類似情況下關閉的情況(根據需要啓動的虛擬機)。 – 2009-11-20 14:46:28

+0

好點!對於我們的情況,數據庫不斷運行,因爲它是一個全天候運行的客戶系統。我想知道最簡單的事情是在等待之前運行'MyDatabaseStoredProcedure'腳本嗎?在我們的情況下,這將工作得很好,但它可能不適用於不同的應用程序要求。 – 2009-11-26 07:40:43

+0

有沒有任何缺點讓程序在後臺不斷運行? – tufelkinder 2014-07-16 18:59:06

2

SQL調度http://www.lazycoding.com/products.aspx

  • 自由和簡單
  • 支持SQL Server 2000中,2005的所有版本,和2008年
  • 支持無限SQL Server實例不限數量的就業崗位。
  • 可以輕鬆地安排SQL服務器維護任務:備份,索引重建,完整性檢查等
  • 運行作爲Windows服務崗位上的成功和失敗
1

  • 電子郵件通知自其他類似的問題被問了,並且可能會被作爲這個副本關閉,並且在這裏已經存在的答案中沒有提到許多選項...

    由於您使用的是SQL Express,因此無法使用S QL服務器代理。但是也有很多的選擇,所有這些都可以使用ATWindows Task Scheduler根據您的操作系統上安排:

    所有這些語言/工具(以及其他許多)能夠連接到SQL Server並執行st直接程序。您也可以嘗試這些代理替換:

  • 3

    創建計劃任務調用 「C:\ YourDirNameHere \ TaskScript.vbs」 上啓動。 VBScript中應該執行重複任務執行(在這個例子中,它是一個15分鐘的循環)

    通過命令行(必須運行CMD.EXE作爲管理員):

    schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP 
    

    例TaskScript.vbs:此執行您的自定義SQL腳本靜靜地使用RunSQLScript。蝙蝠

    Do While 1 
        WScript.Sleep(60000*15) 
        Set WshShell = CreateObject("WScript.Shell") 
        WshShell.RUN "cmd /c C:\YourDirNameHere\RunSQLScript.bat C:\YourDirNameHere\Some_TSQL_Script.sql", 0 
    Loop 
    

    RunSQLScript.bat:本品採用SQLCMD調用數據庫實例和執行SQL腳本

    @echo off 
    sqlcmd -S .\SQLEXPRESS -i %1 
    
    +0

    +1尼斯答案:) – 2014-03-07 09:27:15

    +0

    我需要修復的任務調度命令(通過命令行)。事實證明,它不會在下次啓動時自動重新啓動,我必須手動更正它。我將在稍後編輯和修復代碼,只是希望人們意識到。執行代碼雖然工作得很好。 – VoteCoffee 2014-03-10 14:04:26

    +0

    仍然很忙?或者您是否有時間修復命令以完成此答案? – 2015-02-24 14:10:25

    1

    我已經找到了解決這個問題的最簡單的方法是創建一個執行一個查詢存儲過程然後保存它。該查詢應該看起來類似於下面的這個。

     use [database name] 
        exec storedproc.sql 
    

    然後創建一個類似下面的代碼在它的東西一個批處理文件。

    sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql 
    

    然後有任務調度執行批處理往往你喜歡

    0

    公司還使用SQLEXPRESS並沒有SQL代理。

    由於沒有明顯的答案是「正確的」,所有的解決方案都相當複雜,我會分享我那裏做。可能是它真的很糟糕,但它對我很好。

    我選擇插入(人行)的操作,進行了密切的我所需要的相同時間範圍,並提出了觸發「ON INSERT」適用需要功能的表。

    相關問題