0

基本上我有一个批处理文件,它调用一个SQL Server 2008 R2存储过程,该存储过程为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 
+1

在你的代码里是''%hour:〜0,1%“==”“',也就是''''而不是'”“'的印刷双引号,或者它只是一个复制/粘贴问题? –

+0

@MCND在该行的批处理文件中,只有双引号是“”而不是“”,我认为这是从我从其中复制脚本部分的地方开始的一个悬念。你认为这可能是一个问题吗?像我说的,它工作正常,如果我手动执行任务。 –

+0

你的问题是'。\ SQLEXPRESS'。计划任务运行在另一个文件夹('%systemroot%\ system32')中。使用'cd/d'%〜dp0'切换到存储批文件的文件夹 – Stephan

回答

0

我一直面对完全相同的错误。对我而言,解决方案是在脚本的末尾添加exit 0。我不明白为什么,但它的工作。

+0

Oo ...在批处理文件或存储过程的结尾处? –

+0

@PaulZahra我已经尝试了两个,不知道哪一个工作。这是大约五年前,所以我不记得了。 – MichaelS

+0

'exit'是一个批处理命令。 sql脚本以'END'结尾。但我看不到,这在这里可能会有帮助。 – Stephan

相关问题