Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 优化调用sql文件的批处理文件_Sql Server_Batch File_Sqlcmd - Fatal编程技术网

Sql server 优化调用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

我们目前有一个计划程序来运行审计。此计划程序将使用参数调用批处理文件,批处理文件将调用sql脚本(基于参数),该脚本反过来调用存储的过程

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

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() 

这是一个简单的问题,可以在纯批量中解决,前提是您澄清了几点

  • 这里的“%1”是什么?数据库名称可能是什么
  • 您是否只有一个
    SQL文件
    ,如果没有,您发布的示例中的哪些元素需要为不同的数据库替换
  • (抱歉-这不是一个真正的答案本身,但我会在你发布的btch上发表一些(我希望是有用的)评论。所谓的
    评论
    功能确实不适合这里

    @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