基本的には、SQL Server 2008 R2ストアドプロシージャを呼び出すバッチファイルがあります。このプロシージャは、断片化されたテーブルのDBを5%以上断片化してレポートをテキストファイルに出力します。このバッチファイルが自動的に実行されないのはなぜですか?
バッチファイルは、一晩実行するタスクスケジューラジョブとして設定されています。
タスクスケジューラでタスクを右クリックしてすぐに実行すると、スクリプトはSQL Server上で実行され、出力はテキストファイルにリダイレクトされます。問題は私が一晩トリガーするように自動化することです。
set local
REM Preparing Timestamp Information
set year=%date:~6,4%
set month=%date:~3,2%
set day=%date:~0,2%
set hour=%time:~0,2%
REM Replace leading space with zero
if “%hour:~0,1%” ==” ” set hour=0%hour:~1,1%
set minute=%time:~3,2%
set seconds=%time:~6,2%
set FILENAMEANDPATH= c:\DBMaintenanceLogs\SP_InspectorLog_%day%-%month%-%year%_%hour%-%minute%-%seconds%.log
sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_DBIndexFragmentationInspector @IndexFragmentationPercentage=5" -d MyDBName -o %FILENAMEANDPATH%
タスクスケジューラジョブが実行されず、タスクがリターンコード255で正常に完了したと表示されるという問題があります。
タスクは、システム管理者アカウントを使用して実行するように設定されています。
P.S.ストアドプロシージャ:
USE [MyDBName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_DBIndexFragmentationInspector]
@IndexFragmentationPercentage INT
AS
BEGIN
SELECT
OBJECT_NAME(A.[object_id]) as 'TableName',
B.[name] as 'IndexName',
A.[index_type_desc],
A.[avg_fragmentation_in_percent]
FROM
sys.dm_db_index_physical_stats(db_id(),NULL,NULL,NULL,'LIMITED') A
INNER JOIN
sys.indexes B ON A.[object_id] = B.[object_id] and A.index_id = B.index_id
where [avg_fragmentation_in_percent] > @IndexFragmentationPercentage
order by TableName
END
あなたのコード ''%hour:〜0,1% "==" "'、実際には '' ''の代わりに '' "'であるか、ペーストの問題? –
@MCNDその行のバッチファイルでは二重引用符だけが ""であり、 ""ではなく、私はそれがスクリプトのその部分をコピーしたところからハングオーバーだと思います。それが問題になると思いますか?私はタスクを手動で実行するとうまくいくと言っています。 –
あなたの問題は '。\ SQLEXPRESS'です。スケジュールされたタスクは別のフォルダ( '%systemroot%\ system32')で実行されます。 – Stephan