Windows環(huán)境下實現(xiàn)批量執(zhí)行Sql文件
使用場景:按文件名字正序,批量執(zhí)行某文件夾下的所有sql文件,并輸出日志
適合人群:實施工程師
一、使用篇
1、準備bat文件:
1.1、ExecSql.bat(執(zhí)行腳本)(文件編碼:ANSI,這個編碼與下面提到的utf8和gb2312都不一樣,用記事本編輯默認就是這個編碼,所以不一定要下notepad++)
@ECHO OFF SET dbhost=127.0.0.1 SET dbuser=sa SET dbpasswd=sa SET dbName=Application REM 以下內(nèi)容不建議修改 REM 執(zhí)行腳本的路徑,此處為當前路徑 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% ::執(zhí)行sql腳本 echo 開始執(zhí)行sql腳本,所有日志記錄于%logFileName% for /r %%i in (*.sql) do ( echo %%i被執(zhí)行 & 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
@ECHO OFF for /r %%i in (*.sql) do ( echo %%i ) ECHO 完成! PAUSE
3、【可選做】排序,如果對sql文件的執(zhí)行順序有要求的,需要對文件進行重命名,如上圖所示,執(zhí)行順序為文件名字正序,建議使用“01.”這種作為文件名前綴
將ShowOrder.bat復制到目標根目錄下,雙擊運行,查看執(zhí)行順序是否符合預期
4、【重要】編碼轉(zhuǎn)換,一般情況下.sql文件的編碼都是utf8,如果.sql文件內(nèi)容中,使用了中文(注釋不算),則需要修改文件編碼是GB2312,否則會執(zhí)行錯誤的sql語句。
比如01.XXX.sql的編碼是utf8的,但插入數(shù)據(jù)庫的數(shù)據(jù)卻是亂碼
以下4.1和4.2擇一執(zhí)行
4.1、修改編碼的方法為:使用Notepad打開.sql文件,ctrl+A(全選),ctrl+C(復制),點擊Notepad“編碼”->“編碼字符集”->“中文”->“GB2312”,應該會出現(xiàn)一個“無法恢復警告”,點“是”,ctrl+A(全選),ctrl+V(粘貼),最后保存
4.2、使用工具(EncodingConverter)批量修改:下載好工具后解壓即可運行,雙擊BatchConvertor.exe,如下圖所示設置
轉(zhuǎn)化完成后會再執(zhí)行會得到正確的中文
5、修改bat文件,用Notepad++或別的編輯器打開bat文件,修改ExecSql.bat中的數(shù)據(jù)庫連接相關信息,只改跟連接數(shù)據(jù)庫相關的4個變量即可,其他不需要修改,改完后保存
6、雙擊bat文件,會有如圖所示的輸出
7、查看日志,檢查每一個.log文件,沒有消息就是好消息,一個執(zhí)行正確腳本的.log文件一般長這樣
有錯誤也會反饋出來,如腳本再執(zhí)行一次就會報錯
特別提醒:此bat文件會檢查當前文件夾下所有的.sql文件并執(zhí)行,再次執(zhí)行bat時需要刪掉一些不用再次執(zhí)行的.sql文件
二、原理篇
sqlcmd和osql兩種命令都可以執(zhí)行sql文件,兩者參數(shù)配置項幾乎完全一樣,這里選用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
相關文章
MSSQL 將截斷字符串或二進制數(shù)據(jù)問題的解決方法
主要原因就是給某個字段賦值時,內(nèi)容大于字段的長度或類型不符造成的2010-10-10SQL?Server解析/操作Json格式字段數(shù)據(jù)的方法實例
SQL SERVER沒有自帶的解析json函數(shù),需要自建一個函數(shù)(表值函數(shù)),下面這篇文章主要給大家介紹了關于SQL?Server解析/操作Json格式字段數(shù)據(jù)的相關資料,需要的朋友可以參考下2022-08-08SQL Server使用游標處理Tempdb究極競爭-DBA問題-程序員必知
這篇文章主要介紹了SQL Server使用游標處理Tempdb究極競爭-DBA問題-程序員必知的相關資料,需要的朋友可以參考下2015-11-11執(zhí)行一條sql語句update多條記錄實現(xiàn)思路
如果你想更新多行數(shù)據(jù),并且每行記錄的各字段值都是各不一樣,你會怎么辦呢?本文以一個示例向大家講解下如何實現(xiàn)如標題所示的情況,有此需求的朋友可以了解下2013-08-08sql server 數(shù)據(jù)庫路徑可以自己定制 sql server數(shù)據(jù)庫存儲位置
我們在安裝sqlserver數(shù)據(jù)庫的時候想自己定制數(shù)據(jù)庫的存放位置,一個是默認程序與默認數(shù)據(jù)庫的位置,另外一個是自己新建的數(shù)據(jù)庫的時候的存放位置,其實都是可以自定義的2024-04-04如何在 SQL SERVER 中快速有條件刪除海量數(shù)據(jù)
如何在 SQL SERVER 中快速有條件刪除海量數(shù)據(jù)...2006-12-12