简化调用sql文件的批处理文件

时间:2013-03-25 20:47:36

标签: sql-server batch-file sqlcmd

我们目前有一个调度程序来运行审核。此调度程序将使用参数调用批处理文件,批处理文件调用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
)

2 个答案:

答案 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)

这是一个简单的问题,需要在纯批次 提供 中解决几点。

  1. 这里的“%1”是什么?数据库名称可能是?
  2. 您是否只有一个SQL file,如果没有,您发布的样本中的哪些元素需要替换为不同的数据库?
  3. (抱歉 - 这本身并不是一个答案,但我会在发布的帖子上发表一些(我希望,有用的)评论.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 ......?