0

現在、監査を実行するためのスケジューラがあります。このスケジューラーはパラメーターを使用してバッチファイルを呼び出し、バッチファイルは(パラメーターに基づいて)SQLスクリプトを呼び出し、次にストアドプロシージャを呼び出します。

実行される監査ごとに、個別のバッチファイルとSQLファイル。最良の場合、以下の2つのファイルを1つのファイルに結合して、すべての新しい監査に使用できるようにします。最悪の場合、少なくとも、監査ごとに2つではなく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. 持っている要素は1つだけです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

OK:%1おそらく、データベース名をidします。だから-なぜ-d databaseそしてそうではない-d %1??

なぜ> D:\...ではなく'-oD:...` ??

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

ああ!その栄光の中で失敗する失敗のシナリオ!最も一般的には、ERRORLEVEL 0を取得しますが、ERRORLEVELsqlcmd COPY変更できます。成功した場合、COPYERRORLEVELは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 に答える