iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0

上回我們利用了PowerShell來執行我們產出的多條命令列,現在我們可以不用透過開啟SSMS來執行SQL命令以及.sql腳本,不過如果我們執行的命令列順序有瑕疵或是錯誤,途中可能造成中斷或是錯誤的預期結果。

發生例外

上回我們的ps1檔案邏輯如下:
1.新增資料庫
2.將腳本寫進目標資料庫

sqlcmd -S . -Q "CREATE DATABASE One" 
sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql 

假設我們將內容故意寫錯而變成不合理的情形,如下:

  1. 將既有資料庫刪除(確保我的目標資料庫不存在)
  2. 新增資料庫 (但是CLI故意寫錯造成發生錯誤並且新增資料庫失敗)
  3. 將腳本寫進目標資料庫
sqlcmd -S . -Q "DROP DATABASE One" 
sqlcm -S . -Q "CREATE DATABASE One" 
sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql 

利用PowerShell ISE執行可以看到會發生錯誤,雖然不會讓整個執行緒中斷,但是最後結果會發現腳本資料沒有寫進資料庫中。


例外處理

在開發的過程中經常必須考慮發生例外的情形,除了正確回報錯誤訊息外,若能適當地處理例外,可以大幅減少開發或維運人員的調查成本。


對於上述的情形,因情境較為單純,假設我們想要而外做的處理如下:
1.回報錯誤訊息
2.若執行腳本時發現資料庫不存在,就改為先新增資料庫再重新執行腳本


讓我們試試看使用Try-Catch來完成上述情境,程式碼如下:

Try
{
 #主要程式邏輯,採用原本有瑕疵的程式
 sqlcmd -S . -Q "DROP DATABASE One" 
 sqlcm -S . -Q "CREATE DATABASE One" 
 sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql
}
Catch
{
 #因能預期是發生甚麼錯誤,所以直接回報錯誤情形
 Write-Output "資料庫新增失敗,已重新處理"
 sqlcmd -S . -Q "CREATE DATABASE One" 
 sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql
 Write-Output "資料重新處理完成"
}

完成執行後透過PowerShell ISE的訊息或是開啟SSMS查看是否成功,另外也能將主要程式邏輯改成正確的,再驗證是否會走到Catch那段。

更多小知識,我們下次見~~


上一篇
DAY 7 :SQL Server利用PowerShell逐步執行命令列
下一篇
DAY 9 :PowerShell使用環境變數減少Hard Code
系列文
沒有厲害的頭腦,也能利用腳本實現懶人寫程式的夢想30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言