SQL Server Express Editionで毎日特定の時刻にストアドプロシージャを実行する方法は?
ノート:
関連する質問:
SQL Server ExpressにはSQLエージェントが付属していないため、Windowsスケジューラを使用して、ストアドプロシージャまたはSQLスクリプトでSQLCMDを実行できます。
次のメカニズムが機能していることがわかりました。
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
いくつかのメモ:
起動時に「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
Express Editionを使用している場合は、何らかの方法でWindowsスケジューラまたはサーバーに接続しているアプリケーションを使用する必要があります。
スケジューラを使用してsqlcmdを実行します。 ここにいくつかの手順があります エクスプレス版でsqlcmdを動作させるため。
SQL Schedulerfrom http://www.lazycoding.com/products.aspx
SQL Expressでのスケジューリングのもう1つのアプローチは、 Service Broker Conversation Timers を使用することです。定期的にストアドプロシージャを実行するには、bootstrapカスタムスケジューラに使用できます。
例を参照してください SQL Server Expressでのジョブのスケジュール
別の同様の質問が尋ねられたので、おそらくこの質問の複製として閉じられるでしょう、そして、ここにすでに存在する答えに言及されていない多くのオプションがあります...
SQL Expressを使用しているため、SQL Serverエージェントを使用できません。ただし、多くの代替手段があり、それらはすべて、オペレーティングシステムに応じて [〜#〜] at [〜#〜] または Windows Task Scheduler を使用してスケジュールできます。
これらのすべての言語/ツール(および他の多く)には、SQL Serverに接続してストアドプロシージャを実行する能力があります。これらのエージェントの交換を試すこともできます:
この問題に取り組む最も簡単な方法は、ストアドプロシージャを実行するクエリを作成して保存することです。クエリは次のようになります。
use [database name]
exec storedproc.sql
次に、以下のコードに似たものを含むバッチファイルを作成します。
sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql
次に、タスクスケジューラに好きなだけバッチを実行させます
正しく指摘したように、エージェントプロセスを使用しない場合は、サーバーの外部に何か他のもの(おそらく、作成してインストールするサービスまたはWindowsスケジューラー)が必要になります。
ローカルアプリケーションの高速インストールでは、テーブルを切り捨てる時点でマシンがオンになっていない可能性があることに注意してください(毎晩真夜中に切り捨てるように設定しますが、ユーザーはマシンをオンにしないでください) )。
したがって、スケジュールされたタスクは実行されず、監査ログは制御不能になります(これもSQL Serverエージェントの問題ですが、実サーバーがノンストップで実行されていると想定されます)。この状況があなたの状況に合った場合のより良い戦略は、切り捨てまたは操作が何であれX日以上経過したことをアプリケーションがオンデマンドで実行するようにすることです。
もう1つ注意すべき点は、Webアプリケーションについて話している場合、アプリケーションが読み込まれる時間があり、そのイベントが発生したときに操作が実行される可能性があることです。
コメントで述べたように、 sp_procoption があります。これにより、エンジンを起動するたびにSPを実行できます-この方法の欠点は、インスタンスを実行している場合、呼び出しと呼び出しの間には長い時間がかかる可能性があり、操作を実行する必要があるときにエンジンが実行されていない場合は問題が残ります。
当社もSQLEXPRESSを使用しており、SQLエージェントはありません。
「正しい」とマークされた答えはなく、すべての解決策は非常に複雑なので、そこで行ったことを共有します。本当に悪いかもしれませんが、それは私にとってはうまくいきました。
私は、必要な同じ時間範囲に近いテーブルへの挿入の操作を選択し(人々が行う)、必要な機能を適用するトリガー "ON INSERT"を作成しました。
タスクスケジューラを使用して、SQLステートメントを実行する単純なコンソールアプリを起動できます。