0

我们目前有一个调度程序来运行审计。这个调度器会调用一个带参数的批处理文件,批处理文件调用一个sql脚本(基于参数),然后调用一个存储的proc。

对于每个运行的审计,一个单独的批处理文件和 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
)
4

2 回答 2

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() 
于 2013-03-26T03:20:03.540 回答
0

这是一个在纯批处理中解决的简单问题,提供您澄清几点。

  1. 这里的“%1”是什么?可能是数据库名称?
  2. 您是否只有一个SQL file,如果没有,您发布的示例中的哪些元素需要针对不同的数据库进行替换?

(对不起 - 这本身并不是一个真正的答案,但我会在你发布的 btch 上发表一些(我希望,有用的)评论。SOcomment设施真的不适合这里......

@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

好的:所以很可能,%1id 是数据库名称。那么-为什么-d database而不是-d %1

为什么> D:\...而不是 '-o D:...` ??

if %ERRORLEVEL% GTR 0 COPY "D:\Temp\%1.csv" "D:\Internal_Reports\%1\%1.txt"

确认!失败到失败的场景在其所有荣耀中!最常见的是,您会从sqlcmd BUT COPY中获得 ERRORLEVEL 0,但可以更改 ERRORLEVEL。如果COPY成功,则 ERRORLEVEL 将为 0,但如果COPY失败,则为ERRORLEVEL非零,这就是以下步骤将使用的值...

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出现了一个无法解释的...?

于 2013-03-26T04:09:15.773 回答