2017年10月2日 星期一

bat & sqlcmd 筆記

會寫 bat 主要是因為每次改完程式之後會需要更新好幾個環境
ex.今天的修改紀錄資料夾、公司環境的資料夾等等
單純的複製到固定名稱的資料夾大致上沒啥問題
比較大的問題是【今天的修改紀錄資料夾】的"今天",
代表的我每天都要複製到不同的日期資料夾去...
估狗了一下,

@set A=%date:/=%
@set B=%A:~0,8%
@set C="\\UPDATE\%B%\DLL\"

假設今天是 2017/10/2 用上面的寫法可以得到
C="\\UPDATE\20171002\DLL\"

可是每次都要先去檢查有沒有件資料夾,所以...

IF NOT EXIST %C%. (MKDIR %C%.)

上面的寫法可以檢查有沒有 \20171002\DLL 的資料夾,
如果沒有,則執行 MKDIR 建立

到了以上,自動複製 dll 的沒有問題了
再來就是 SQL 檔的問題了,每次還又一個一個更新 DB 很煩,
真想請一個小助手來幫忙...
所以又找到了 sqlcmd ,
但是發現 sqlcmd 在每一版的 SQL SERVER 提供的命令、參數,甚至是寫法都不一樣
所以首先就先指定 sqlcmd 的路徑,我是直接設定變數指定

@set SQLPATH="C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\sqlcmd"

然後指定好下面的參數

@set TEST= -S FRANKIE\sql2014 -U sa -P 1234567 -d FRANKIE_TEST -i 
  • -S 指定 SQL SERVER 主機\Instances
  • -U 指定登入的帳號
  • -P 指定登入帳號的密碼
  • -d 指定DB
  • -i 要執行的 SQL 檔案
假設我們要執行的是 AAA.SQL

%SQLPATH%%TEST% AAA.SQL

大概會組合出

C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\sqlcmd -S FRANKIE\sql2014 -U sa -P 1234567 -d FRANKIE_TEST -i AAA.SQL

不過我想執行資料夾下面的所有 SQL 檔,
所以再度估狗一下,最後用 FOR 處理,
直接在 CMD 視窗測試 FOR 的時候都OK,
可是從 BAT 檔執行的時候卻一直跳出錯誤,
原來變數在 CMD 視窗的時候是 %i
但是在 BAT 檔的時候要變成 %%i
最後寫在 BAT 的 FOR 如下:

for %%i in (*.sql) do %SQLPATH%%TEST% %%i

(*.sql) 會幫我把執行所在的資料夾中的 SQL 全部都找出來,
然後執行 do 後面的事情。

寫到這裡,更新資料夾與 DB 對我來說變成只是 double click 了,喔耶~~~

但是事情還是做不完,囧rz

沒有留言:

張貼留言