文章出處

需求描述

一般在生產環境中,在投產的情況下,需要批量的來執行SQL腳本文件,來完成整個投產,如果投產文件比較多的情況下,無疑這是一個比較痛苦的過程,所以本篇通過PowerShell腳本來批量完成。

 

監控腳本

 

<#批量執行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 $_
   
}

其中涉及到幾個參數需要配置:

1、批量文件的根目錄路徑

2、此腳本支持兩種驗證方式:用戶驗證 & Windows驗證,根據需要自己確定

執行完成報告如下:

當然,最重要的就是,如果執行過程中,某一個腳本出錯的問題解決,其實只需要標示出錯誤的文件名稱和錯誤的信息就可以。

根據需要,自行調整腳本,調整至正確,然后重新執行此腳本就可以了。 

調度腳本

有時候我們部署一般都安排窗口期,這也就意味著需要在夜間某個定時時間去執行該腳本的部署。

為了解決這個問題,Powershell提供了兩種基本的調度方式:

1、通過SQL Server的agent建立相應的Job定時的去執行,以完成部署。

2、通過Windows的計劃任務去執行調度。

以上兩種方式都比較簡單,網上資料很多,大家自行查閱。

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()