[SQL Server]一次執行資料夾內的.sql 指令碼

初始資料庫時,我們Developers們會準備很多.sql指令碼來建立資料表、檢視甚至初始資料,那麼要怎麼一次執行資料夾內的*.sql或是指定的幾個.sql指令碼?

來節省一點點初始化資料庫的作業時間。

 

好在我們有MSDN使用sqlcmd 執行指令碼的範例:

sqlcmd -S myServer\instanceName -i C:\myScript.sql

如果只有幾個,串成bat檔或是powershell也很方便,但如果很多個,

一來要重複寫很多次,二來也沒辦法Handle到指定資料夾內的.sql都要執行的需求

 

很快的從網路找到答案,然後我們改寫了語法,並且把執行的log寫到指定的Log檔名中。

1.執行指定資料夾內的.sql

@echo off
rem 資料庫IP\資料庫執行個體名稱
set dbIp=stanley\SQL2014
rem 資料庫名稱
set dbName=TSQL2014
rem 登入帳號
set dbUsrAcc=ImDeveloper
rem 使用者密碼
set dbUsrPwd=Passw0rd
rem 整理完畢的SQL指令集資料夾位置
set batchFilePath="C:\TestDB\db_script\folder"

rem 程式開始執行
cd %batchFilePath%

FOR /f %%i IN ('DIR *.Sql /B') do call :RunScript %%i
GOTO :END

:RunScript
Echo Executing %1
sqlcmd -S %dbIp% -d %dbName% -U %dbUsrAcc% -P %dbUsrPwd% -i %1 >>view.log
Echo Completed %1

:END

2.透過清單.sql檔案執行

list.sql 清單(sql01~06和bat檔同目錄)

:r .\sql01.sql 
:r .\sql02.sql 
:r .\sql03.sql 
:r .\sql04.sql 
:r .\sql05.sql 
:r C:\testDB\db_script\sql06.sql

批次檔內容

@echo off
rem 資料庫IP\資料庫執行個體名稱
set dbIp=stanley\SQL2014
rem 資料庫名稱
set dbName=TSQL2014
rem 登入帳號
set dbUsrAcc=ImDeveloper
rem 使用者密碼
set dbUsrPwd=Passw0rd
rem 清單.SQL檔放置路徑
set dbSqlFilePath="C:\test\db_script\list.sql"


rem 程式開始執行
cd %batchFilePath%
sqlcmd -S %dbIp% -d %dbName% -U %dbUsrAcc% -P %dbUsrPwd% -i %dbSqlFilePath% >view.log
PAUSE

@echo on

 

今天同事來問,一整個忘記當初怎麼串的,快筆記下來。

 

參考:

使用 sqlcmd 連接至 Database Engine

使用 sqlcmd 執行 Transact-SQL 指令碼檔案

Run all SQL files in a directory

SQL Server – Executing Multiple Script Files Using SQLCMD