Windows環(huán)境下實(shí)現(xiàn)批量執(zhí)行Sql文件
使用場(chǎng)景:按文件名字正序,批量執(zhí)行某文件夾下的所有sql文件,并輸出日志
適合人群:實(shí)施工程師
一、使用篇
1、準(zhǔn)備bat文件:
1.1、ExecSql.bat(執(zhí)行腳本)(文件編碼:ANSI,這個(gè)編碼與下面提到的utf8和gb2312都不一樣,用記事本編輯默認(rèn)就是這個(gè)編碼,所以不一定要下notepad++)
@ECHO OFF SET dbhost=127.0.0.1 SET dbuser=sa SET dbpasswd=sa SET dbName=Application REM 以下內(nèi)容不建議修改 REM 執(zhí)行腳本的路徑,此處為當(dāng)前路徑 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 開(kāi)始執(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、【可選做】排序,如果對(duì)sql文件的執(zhí)行順序有要求的,需要對(duì)文件進(jìn)行重命名,如上圖所示,執(zhí)行順序?yàn)槲募终?,建議使用“01.”這種作為文件名前綴
將ShowOrder.bat復(fù)制到目標(biāo)根目錄下,雙擊運(yùn)行,查看執(zhí)行順序是否符合預(yù)期

4、【重要】編碼轉(zhuǎn)換,一般情況下.sql文件的編碼都是utf8,如果.sql文件內(nèi)容中,使用了中文(注釋不算),則需要修改文件編碼是GB2312,否則會(huì)執(zhí)行錯(cuò)誤的sql語(yǔ)句。
比如01.XXX.sql的編碼是utf8的,但插入數(shù)據(jù)庫(kù)的數(shù)據(jù)卻是亂碼


以下4.1和4.2擇一執(zhí)行
4.1、修改編碼的方法為:使用Notepad打開(kāi).sql文件,ctrl+A(全選),ctrl+C(復(fù)制),點(diǎn)擊Notepad“編碼”->“編碼字符集”->“中文”->“GB2312”,應(yīng)該會(huì)出現(xiàn)一個(gè)“無(wú)法恢復(fù)警告”,點(diǎn)“是”,ctrl+A(全選),ctrl+V(粘貼),最后保存
4.2、使用工具(EncodingConverter)批量修改:下載好工具后解壓即可運(yùn)行,雙擊BatchConvertor.exe,如下圖所示設(shè)置

轉(zhuǎn)化完成后會(huì)再執(zhí)行會(huì)得到正確的中文

5、修改bat文件,用Notepad++或別的編輯器打開(kāi)bat文件,修改ExecSql.bat中的數(shù)據(jù)庫(kù)連接相關(guān)信息,只改跟連接數(shù)據(jù)庫(kù)相關(guān)的4個(gè)變量即可,其他不需要修改,改完后保存

6、雙擊bat文件,會(huì)有如圖所示的輸出

7、查看日志,檢查每一個(gè).log文件,沒(méi)有消息就是好消息,一個(gè)執(zhí)行正確腳本的.log文件一般長(zhǎng)這樣

有錯(cuò)誤也會(huì)反饋出來(lái),如腳本再執(zhí)行一次就會(huì)報(bào)錯(cuò)

特別提醒:此bat文件會(huì)檢查當(dāng)前文件夾下所有的.sql文件并執(zhí)行,再次執(zhí)行bat時(shí)需要?jiǎng)h掉一些不用再次執(zhí)行的.sql文件
二、原理篇
sqlcmd和osql兩種命令都可以執(zhí)行sql文件,兩者參數(shù)配置項(xiàng)幾乎完全一樣,這里選用sqlcmd是出于這個(gè)的日志輸出比較整潔,且微軟打算在未來(lái)SqlServer中刪除osql(不再支持)。兩種命令都可以在cmd中使用XXX/?來(lái)查詢幫助
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
相關(guān)文章
SQL Server誤區(qū)30日談 第9天 數(shù)據(jù)庫(kù)文件收縮不會(huì)影響性能
收縮文件的過(guò)程非常影響性能,這個(gè)過(guò)程需要移動(dòng)大量數(shù)據(jù)從而造成大量IO,這個(gè)過(guò)程會(huì)被記錄到日志從而造成日志暴漲,相應(yīng)的,還會(huì)占去大量的CPU資源2013-01-01
MSSQL數(shù)據(jù)類(lèi)型及長(zhǎng)度限制詳細(xì)說(shuō)明
在 Microsoft® SQL Server™ 中,每個(gè)列、局部變量、表達(dá)式和參數(shù)都有一個(gè)相關(guān)的數(shù)據(jù)類(lèi)型,這是指定對(duì)象可持有的數(shù)據(jù)類(lèi)型(整型、字符、money 等等)的特性。2008-08-08
SQL如何實(shí)現(xiàn)橫表與縱表相互轉(zhuǎn)換
針對(duì)SQL橫向表轉(zhuǎn)縱向的問(wèn)題,本文從實(shí)際應(yīng)用出發(fā),詳細(xì)講解了語(yǔ)法和操作步驟,并結(jié)合實(shí)例進(jìn)行了演示和說(shuō)明。文章還探討了該方法的優(yōu)缺點(diǎn),提出了一些值得注意的事項(xiàng),旨在幫助讀者更深入地理解這一重要的數(shù)據(jù)處理技巧2023-04-04
SQL Server數(shù)據(jù)庫(kù)復(fù)制失敗的原因及解決方法
本文我們主要介紹了SQL Server數(shù)據(jù)庫(kù)中由于mssqlserver沒(méi)有停止造成數(shù)據(jù)庫(kù)復(fù)制失敗的解決方法,需要的朋友可以參考下2015-08-08
SQL中WHERE變量IS NULL條件導(dǎo)致全表掃描問(wèn)題的解決方法
今天在評(píng)審接手的項(xiàng)目中的存儲(chǔ)過(guò)程時(shí),發(fā)現(xiàn)存在大量的在條件里判斷變量是否NULL的寫(xiě)法2013-09-09
CPU?核心數(shù)超過(guò)?Enterprise?Server/CAL?限制問(wèn)題的解決方法
最近有客戶要求安裝sql?server?2019?數(shù)據(jù)庫(kù),安裝過(guò)程中提示Enterprise?Server/CAL?CPU?核心利用率限制規(guī)則生成了警告,CPU?核心數(shù)超過(guò)?Enterprise?Server/CAL?限制,20?個(gè)物理核心,或已啟用超線程的?40?個(gè)邏輯核心,原來(lái)企業(yè)版也是有區(qū)別的2024-04-04
SQLSERVER服務(wù)手工啟動(dòng) 批處理文件
裝完SQLSERVER2005 因?yàn)殚_(kāi)機(jī)很慢 所以呢就把開(kāi)機(jī)服務(wù)搞成手動(dòng)的了,這樣開(kāi)機(jī)快了很多可是問(wèn)題也來(lái)了每次要用SqlServer的時(shí)候要一個(gè)一個(gè)服務(wù)去開(kāi)起來(lái)2011-03-03
SQLServer CONVERT 函數(shù)測(cè)試結(jié)果
SQLServer CONVERT 函數(shù)的一些測(cè)試結(jié)果,大家可以很方便的參考各個(gè)參數(shù)的結(jié)果。2009-07-07



