web-dev-qa-db-ja.com

SQL Server Express Editionでストアドプロシージャを毎日実行する方法

SQL Server Express Editionで毎日特定の時刻にストアドプロシージャを実行する方法は?

ノート:

  • これは、監査テーブルを切り捨てるために必要です。
  • 別の方法として挿入クエリを変更することもできますが、これはおそらく効率的ではありません
  • SQL Server Express EditionにはSQL Serverエージェントがありません

関連する質問:

24
Thomas Bratt

SQL Server ExpressにはSQLエージェントが付属していないため、Windowsスケジューラを使用して、ストアドプロシージャまたはSQLスクリプトでSQLCMDを実行できます。

http://msdn.Microsoft.com/en-us/library/ms162773.aspx

24
Raj More

次のメカニズムが機能していることがわかりました。

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

いくつかのメモ:

  • クエリが実際に実行されたことを確認できるように、監査エントリをどこかに書き込む価値があります。
  • スクリプトを初めて実行するために、サーバーを1回再起動する必要があります。
8
Thomas Bratt

起動時に「C:\ YourDirNameHere\TaskScript.vbs」を呼び出すスケジュールされたタスクを作成します。 VBScriptは繰り返しタスクを実行する必要があります(この例では、15分間のループです)

コマンドライン経由(管理者としてcmd.exeを実行する必要があります):

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

TaskScript.vbsの例:これは、RunSQLScript.batを使用してカスタムSQLスクリプトをサイレントに実行します

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
4
VoteCoffee

Express Editionを使用している場合は、何らかの方法でWindowsスケジューラまたはサーバーに接続しているアプリケーションを使用する必要があります。

スケジューラを使用してsqlcmdを実行します。 ここにいくつかの手順があります エクスプレス版でsqlcmdを動作させるため。

4
Yishai

SQL Schedulerfrom http://www.lazycoding.com/products.aspx

  • 無料でシンプル
  • SQL Server 2000、2005、および2008のすべてのバージョンをサポート
  • ジョブの数に制限のない無制限のSQL Serverインスタンスをサポートします。
  • バックアップ、インデックスの再構築、整合性チェックなど、SQL Serverのメンテナンスタスクを簡単にスケジュールできます。
  • Windowsサービスとして実行
  • ジョブの成功と失敗に関するメール通知
2
Iman Abidi

SQL Expressでのスケジューリングのもう1つのアプローチは、 Service Broker Conversation Timers を使用することです。定期的にストアドプロシージャを実行するには、bootstrapカスタムスケジューラに使用できます。

例を参照してください SQL Server Expressでのジョブのスケジュール

別の同様の質問が尋ねられたので、おそらくこの質問の複製として閉じられるでしょう、そして、ここにすでに存在する答えに言及されていない多くのオプションがあります...

SQL Expressを使用しているため、SQL Serverエージェントを使用できません。ただし、多くの代替手段があり、それらはすべて、オペレーティングシステムに応じて [〜#〜] at [〜#〜] または Windows Task Scheduler を使用してスケジュールできます。

これらのすべての言語/ツール(および他の多く)には、SQL Serverに接続してストアドプロシージャを実行する能力があります。これらのエージェントの交換を試すこともできます:

1
Aaron Bertrand

この問題に取り組む最も簡単な方法は、ストアドプロシージャを実行するクエリを作成して保存することです。クエリは次のようになります。

     use [database name]
     exec storedproc.sql

次に、以下のコードに似たものを含むバッチファイルを作成します。

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

次に、タスクスケジューラに好きなだけバッチを実行させます

1
BrianMichaels

正しく指摘したように、エージェントプロセスを使用しない場合は、サーバーの外部に何か他のもの(おそらく、作成してインストールするサービスまたはWindowsスケジューラー)が必要になります。

ローカルアプリケーションの高速インストールでは、テーブルを切り捨てる時点でマシンがオンになっていない可能性があることに注意してください(毎晩真夜中に切り捨てるように設定しますが、ユーザーはマシンをオンにしないでください) )。

したがって、スケジュールされたタスクは実行されず、監査ログは制御不能になります(これもSQL Serverエージェントの問題ですが、実サーバーがノンストップで実行されていると想定されます)。この状況があなたの状況に合った場合のより良い戦略は、切り捨てまたは操作が何であれX日以上経過したことをアプリケーションがオンデマンドで実行するようにすることです。

もう1つ注意すべき点は、Webアプリケーションについて話している場合、アプリケーションが読み込まれる時間があり、そのイベントが発生したときに操作が実行される可能性があることです。

コメントで述べたように、 sp_procoption があります。これにより、エンジンを起動するたびにSPを実行できます-この方法の欠点は、インスタンスを実行している場合、呼び出しと呼び出しの間には長い時間がかかる可能性があり、操作を実行する必要があるときにエンジンが実行されていない場合は問題が残ります。

0
Cade Roux

当社もSQLEXPRESSを使用しており、SQLエージェントはありません。

「正しい」とマークされた答えはなく、すべての解決策は非常に複雑なので、そこで行ったことを共有します。本当に悪いかもしれませんが、それは私にとってはうまくいきました。

私は、必要な同じ時間範囲に近いテーブルへの挿入の操作を選択し(人々が行う)、必要な機能を適用するトリガー "ON INSERT"を作成しました。

0
KennyKivi

タスクスケジューラを使用して、SQLステートメントを実行する単純なコンソールアプリを起動できます。

0
Craig Bart