我们目前有一个调度程序来运行审核。此调度程序将使用参数调用批处理文件,批处理文件调用sql脚本(基于参数),该脚本又调用存储过程。
对于每个运行的审核,单独的批处理文件和sql文件。最好的情况我想将以下两个文件合并为一个文件,可用于每个新的审核。最糟糕的情况我至少想结合起来为每次审核获得1个文件,而不是两个。希望你们都能帮忙吗?
批处理文件
@echo on
Echo Running SQL Command File for '%1' Data Audit Check
del "D:\Internal_Reports\%1\%1.txt"
sqlcmd -S localhost -d database -i "D:\DataAudit\%1.sql" -s "," > D:\Temp\%1.csv -I -W -k 1
if %ERRORLEVEL% GTR 0 COPY "D:\Temp\%1.csv" "D:\Internal_Reports\%1\%1.txt"
if %ERRORLEVEL% NEQ 0 goto Error_1
echo No Errors
goto end
:Error_1
if %ERRORLEVEL% NEQ 1 goto Error_2
echo No Errors
goto end
:Error_2
echo Errorlevel %ERRORLEVEL%
set FileName=%1%2
echo Filename %FileName%
echo %ERRORLEVEL% > D:\ErrorLevel\%FileName%
EXIT /B %ERRORLEVEL%
:end
SQL文件
set NoCount on
DECLARE
@createdBy varchar(16),
@dataAuditBatchId int,
@createdDtTm datetime
select
@createdBy = 'AutomatedAudit'
exec CreateNewDataAuditBatch @createdBy, @dataAuditBatchId output
-- Content Scripts
exec specificAuditStoredProc @createdBy, @dataAuditBatchId
select * from vAuditErrors where JobName in ('specificAuditStoredProc')
:exit(select Case When Counter = 0 then 0 Else 1 End 'errorCode'
from (select CAST(Count(*) AS varchar(4)) AS Counter from vAuditErrors
where JobName in ('specificAuditStoredProc'))
CountTable
)
答案 0 :(得分:1)
在这种情况下,最好的选择是PowerShell。您可以结合批处理脚本和直接访问SQL的两个世界。
将以下代码复制到文本文件中:Audit.ps1
创建一个名为:AuditFile.txt的文件,在每一行上放置您的SpecificAuditProc名称。
然后在批处理调度程序中运行:“powershell -command”& c:\ Audit.ps1 -name'ProcName'“
代码[未经测试]:
param([Parameter(Mandatory=$true)][String]$name="")
$createdBy = "AutomatedAudit"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=LOCALHOST;Database=HT;Integrated Security=True"
$SqlConnection.Open()
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = "[CreateNewDataAuditBatch]"
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$SqlCmd.Parameters.Add("@createdBy", $creadtedBy)
$SqlCmd.Parameters.Add("@dataAuditBatchId ")
$SqlCmd.Parameters["@dataAuditBatchId"].Direction = [system.Data.ParameterDirection]::Output
$SqlCmd.ExecuteNonQuery()
$dataAuditBatchId = $Command.Parameters["@dataAuditBatchId"].value
$SqlCmd.Dispose()
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = "[$name]"
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$SqlCmd.Parameters.Add("@createdBy", $creadtedBy)
$SqlCmd.Parameters.Add("@dataAuditBatchId ", $dataAuditBatchId)
$SqlCmd.ExecuteNonQuery()
$SqlCmd.Dispose()
$sqlcheck = @(Invoke-Sqlcmd -Query "select * from vAuditErrors where JobName in ('$name')" -ServerInstance "LOCALHOST\HT")
if ($sqlcheck.Count -ne 0) {
$sqlcheck > D:\Internal_Reports\$name\$name.txt
$sqlcheck.Count >> D:\ErrorLevel\$name
}
$Connection.Close()
$Connection.Dispose()
答案 1 :(得分:0)
这是一个简单的问题,需要在纯批次 提供 中解决几点。
SQL file
,如果没有,您发布的样本中的哪些元素需要替换为不同的数据库?(抱歉 - 这本身并不是一个答案,但我会在发布的帖子上发表一些(我希望,有用的)评论.SO comment
设施真的不适合这里...
@echo on
Echo Running SQL Command File for '%1' Data Audit Check
del "D:\Internal_Reports\%1\%1.txt"
sqlcmd -S localhost -d database -i "D:\DataAudit\%1.sql" -s "," > D:\Temp\%1.csv -I -W -k 1
好的:所以很可能%1
id为数据库名称。那么 - 为什么-d database
而不是-d %1
??
为什么> D:\...
而不是'-o D:...`??
if %ERRORLEVEL% GTR 0 COPY "D:\Temp\%1.csv" "D:\Internal_Reports\%1\%1.txt"
的Ack!无尽的失败场景!最常见的是,您从sqlcmd
获得ERRORLEVEL 0但是 COPY
可以更改ERRORLEVEL。如果COPY
成功,那么ERRORLEVEL将为0,但如果COPY
失败,ERRORLEVEL
将为非零,并且这是以下步骤将使用的值... < / p>
if %ERRORLEVEL% NEQ 0 goto Error_1
echo No Errors
goto end
:Error_1
if %ERRORLEVEL% NEQ 1 goto Error_2
echo No Errors
goto end
您只需执行
即可到达:error_2
if errorlevel 2 goto error2
执行SQLCMD
后直接(表示“如果错误级别为2 或更大”)
:Error_2
echo Errorlevel %ERRORLEVEL%
set FileName=%1%2
echo Filename %FileName%
echo %ERRORLEVEL% > D:\ErrorLevel\%FileName%
EXIT /B %ERRORLEVEL%
:end
突然出现无法解释的%2
......?