1. 程式人生 > 其它 >Windows批量執行Sql檔案

Windows批量執行Sql檔案

使用場景:按檔名字正序,批量執行某資料夾下的所有sql檔案,並輸出日誌
適合人群:實施工程師

一、使用篇

1、原材料:
1.1、ExecSql.bat(執行指令碼)(檔案編碼:ANSI,這個編碼與下面提到的utf8和gb2312都不一樣,用記事本編輯預設就是這個編碼,所以不一定要下notepad++)

@ECHO OFF

SET dbhost=127.0.0.1
SET dbuser=sa
SET dbpasswd=sa
SET dbName=Application

REM 以下內容不建議修改
REM 執行指令碼的路徑,此處為當前路徑
SET sqlpath=%~dp0
REM 日誌檔名
SET temp
=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.log SET logFileName=%sqlpath%%temp: =0% ::執行sql指令碼 echo 開始執行sql指令碼,所有日誌記錄於%logFileName% for /r %%i in (*.sql) do ( echo %%i被執行 & echo ----- %%i log start ----- >> %logFileName% & sqlcmd -S %dbhost% -U %dbuser% -P %dbpasswd% -d %dbName% -i %%i -k -b -m 10
>> %logFileName% & echo ----- %%i log end ----- >> %logFileName% & @echo. >> %logFileName%) ECHO 完成! PAUSE

1.2、ShowOrder.bat(檢視什麼指令碼會被執行,按什麼順序執行)(檔案編碼:ANSI)

@ECHO OFF
for /r %%i in (*.sql) do ( echo %%i )

ECHO 完成!
PAUSE

2、檔案目錄結構,如圖,假設我需要執行此資料夾下所有的sql檔案,將ExecSql.bat複製到目標根目錄下

3、【可選做】如果對sql檔案的執行順序有要求的,需要對檔案進行重新命名,如上圖所示,執行順序為檔名字正序,建議使用“01.”這種作為檔名字首

將ShowOrder.bat複製到目標根目錄下,雙擊執行,檢視執行順序是否符合預期

4、【重要】一般情況下.sql檔案的編碼都是utf8,如果.sql檔案內容中,使用了中文(註釋不算),則需要修改檔案編碼是GB2312,否則會執行錯誤的sql語句。

比如01.XXX.sql的編碼是utf8的,但插入資料庫的資料卻是亂碼

4.1、修改編碼的方法為:使用Notepad開啟.sql檔案,ctrl+A(全選),ctrl+C(複製),點選Notepad“編碼”->“編碼字符集”->“中文”->“GB2312”,應該會出現一個“無法恢復警告”,點“是”,ctrl+A(全選),ctrl+V(貼上),最後儲存
4.2、使用工具(EncodingConverter)批量修改:

轉化完成後會再執行會得到正確的中文

5、用Notepad++開啟bat檔案,修改ExecSql.bat中的資料庫連線相關資訊,只改跟連線資料庫相關的4個變數即可,其他不需要修改

6、儲存後上一步的修改後,雙擊bat檔案,會有如圖所示的輸出

7、檢查每一個.log檔案,沒有訊息就是好訊息,一個執行正確指令碼的.log檔案一般長這樣

有錯誤也會反饋出來,如指令碼再執行一次就會報錯

特別提醒:此bat檔案會檢查當前資料夾下所有的.sql檔案並執行,再次執行bat時需要刪掉一些不用再次執行的.sql檔案

二、原理篇

sqlcmd和osql兩種命令都可以執行sql檔案,兩者引數配置項幾乎完全一樣,這裡選用sqlcmd是出於這個的日誌輸出比較整潔,且微軟打算在未來SqlServer中刪除osql(不再支援)。兩種命令都可以在cmd中使用XXX/?來查詢幫助
sqlcmd的官方文件:https://docs.microsoft.com/zh-cn/sql/tools/sqlcmd-utility?view=sql-server-ver15

osql的官方文件:https://docs.microsoft.com/zh-cn/sql/tools/osql-utility?view=sql-server-ver15

★覺得本文有幫助就回復一句誇讚小倉唯的話吧,如:“唯ちゃん最高です”