Sql server 优化调用sql文件的批处理文件
我们目前有一个计划程序来运行审计。此计划程序将使用参数调用批处理文件,批处理文件将调用sql脚本(基于参数),该脚本反过来调用存储的过程 对于运行的每个审核,都有一个单独的批处理文件和sql文件。最好的情况下,我想把下面两个文件合并成一个文件,可以用于每一个新的审计。最糟糕的情况是,我至少希望合并为每个审计得到一个文件,而不是两个。希望你们都能帮忙 批处理文件Sql server 优化调用sql文件的批处理文件,sql-server,batch-file,sqlcmd,Sql Server,Batch File,Sqlcmd,我们目前有一个计划程序来运行审计。此计划程序将使用参数调用批处理文件,批处理文件将调用sql脚本(基于参数),该脚本反过来调用存储的过程 对于运行的每个审核,都有一个单独的批处理文件和sql文件。最好的情况下,我想把下面两个文件合并成一个文件,可以用于每一个新的审计。最糟糕的情况是,我至少希望合并为每个审计得到一个文件,而不是两个。希望你们都能帮忙 批处理文件 @echo on Echo Running SQL Command File for '%1' Data Audit Check de
@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
)
在这种情况下,您最好的选择是PowerShell。您可以将批处理脚本和直接访问SQL这两种方式结合起来 将以下代码复制到文本文件中:Audit.ps1 创建一个名为:AuditFile.txt的文件,在每行上输入您的特定auditproc名称 然后在批处理计划程序中运行以下命令:“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()
这是一个简单的问题,可以在纯批量中解决,前提是您澄清了几点
SQL文件
,如果没有,您发布的示例中的哪些元素需要为不同的数据库替换评论功能确实不适合这里
@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
标识了数据库名称。那么-为什么-d数据库而不是-d%1
为什么是D:\…
而不是“-o D:…`
if %ERRORLEVEL% GTR 0 COPY "D:\Temp\%1.csv" "D:\Internal_Reports\%1\%1.txt"
确认!失败到失败的场景非常精彩!最常见的情况是,您会从sqlcmd
中获得错误级别0,但是COPY
可以更改错误级别。如果COPY
成功,那么错误级别将为0,但是如果COPY
失败,ERRORLEVEL
将是非零的值,这就是b的值e由以下步骤使用
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或更高”)
突然出现了一个无法解释的%2
。?哪个版本的SQL?请检查下面我的PowerShell建议,如果您对存储过程和批处理脚本感到满意,PowerShell将成为您的新好友%1是正在调用的特定存储过程。这是从当前正在使用的进程中获取的,我正在尝试使用它。至于%2,来自上一次迭代的工件?至于不同的sql文件…老实说,我不确定。我看过几个,它们似乎不同,但大多在(最有可能的)级别上由不同的人制作。当然数据库是不同的。但我相信如果这是唯一的区别,它可以通过一个参数传入?我喜欢powershell的想法。我想我需要你的帮助来修改一下。在我看来,这个文件将通过一个参数来调用。参数是要调用的特定存储过程。它似乎是一个如果这只是遍历文件夹中的所有文件并执行其中的每个文件?编辑以传递命名参数
:Error_2
echo Errorlevel %ERRORLEVEL%
set FileName=%1%2
echo Filename %FileName%
echo %ERRORLEVEL% > D:\ErrorLevel\%FileName%
EXIT /B %ERRORLEVEL%
:end