SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)

需求描述sql

通常在生产环境中,在投产的状况下,须要批量的来执行SQL脚本文件,来完成整个投产,若是投产文件比较多的状况下,无疑这是一个比较痛苦的过程,因此本篇经过PowerShell脚原本批量完成。shell

 

监控脚本ui

 

<#批量执行SQL脚本文件#>
<#===========================================#>
$serverInstance="WUXUEL1" 
$Database="111"
#$userName="sa"
#$password="password01!"
$ScriptPath="C:\powershell\SQLTest\"
$ScriptList="

"
<#===========================================#>
$n="`n"
$r="`r"
While ($ScriptList.IndexOf($n) -gt 0)
    {$ScriptList=$ScriptList.Replace($n,";")}
While ($ScriptList.IndexOf($r) -gt 0)
    {$ScriptList=$ScriptList.Replace($r,";")}    
While ($ScriptList.IndexOf(" ") -gt 0)    
    {$ScriptList=$ScriptList.Replace(" ","")}
While ($ScriptList.IndexOf(",") -gt 0)    
    {$ScriptList=$ScriptList.Replace(",","")}
If ($ScriptList.IndexOf(".sql") –le 0)
{
    $ScriptList=""
    [System.IO.DirectoryInfo]$DirectoryInfo=New-Object System.IO.DirectoryInfo $ScriptPath | Sort-Object
    foreach( $f In ($DirectoryInfo.GetFiles("*.sql"))) 
    {
        $ScriptList=$ScriptList+";"+$f.Name
    }
}
Try
{
    [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ConnectionInfo') |out-null
    $ServerConnection =new-object Microsoft.SqlServer.Management.Common.ServerConnection #$serverInstance,$userName, $password
    $ServerConnection.ConnectionString = "Data Source=$serverInstance;Initial Catalog=$Database;Integrated Security=True"
    try
    {
        $ServerConnection.BeginTransaction()
        Write-Host "BeginTransaction ."
        
        [System.Text.StringBuilder]$Sql=""
        Foreach($File In $ScriptList.Split(";"))
        {        
            if($File -ne "")
            {
                Write-Host $ScriptPath$File  " ...start"

                    $Sql=$Sql.AppendLine(([System.Io.File]::OpenText($ScriptPath+$File)).ReadToEnd())
                    $ServerConnection.ExecuteNonQuery($Sql)|out-null
                    $Sql="" 
      
                Write-Host $ScriptPath$File  " ...OK!"
            }
        }
        $ServerConnection.CommitTransaction()
        
        Write-Host "CommitTransaction ."      
    }
    Catch
    {
        If ($ServerConnection.TransactionDepth -gt 0)
            {
                $ServerConnection.RollBackTransaction()
                Write-Host "RollBackTransaction ."
            }            
         
        Write-Error $_     
    }    
}
Catch
{
    Write-Error $_
   
}

其中涉及到几个参数须要配置:spa

一、批量文件的根目录路径code

二、此脚本支持两种验证方式:用户验证 & Windows验证,根据须要本身肯定server

执行完成报告以下:blog

固然,最重要的就是,若是执行过程当中,某一个脚本出错的问题解决,其实只须要标示出错误的文件名称和错误的信息就能够。ip

根据须要,自行调整脚本,调整至正确,而后从新执行此脚本就能够了。 部署

调度脚本it

有时候咱们部署通常都安排窗口期,这也就意味着须要在夜间某个定时时间去执行该脚本的部署。

为了解决这个问题,Powershell提供了两种基本的调度方式:

一、经过SQL Server的agent创建相应的Job定时的去执行,以完成部署。

二、经过Windows的计划任务去执行调度。

以上两种方式都比较简单,网上资料不少,你们自行查阅。

相关文章
相关标签/搜索