當 SQL 腳本檔過大(數百 MB 以上),SSMS 開啟易導致記憶體不足、介面卡死或逾時。osql / sqlcmd 命令列工具直接串流執行,記憶體佔用極低,是大型腳本部署的標準作法。
osql -S <伺服器> -U <帳號> -P <密碼> -i <腳本路徑> [-o <輸出日誌>] [-b] [-n]
| 參數 | 說明 | 範例 |
|---|---|---|
-S | 伺服器名稱/IP,具名執行個體用 IP\INSTANCE | -S 192.168.1.50\SQL2019 |
-U | SQL 登入帳號 | -U sa |
-P | 密碼(區分大小寫),若省略會提示輸入 | -P P@ssw0rd |
-i | 輸入腳本檔完整路徑 | -i D:\Deploy\Schema_v2.sql |
-o | 輸出訊息導向檔案(建議加上) | -o D:\Logs\deploy_20240115.log |
-b | 發生錯誤時結束並回傳 ERRORLEVEL | 批次檔自動化必加 |
-n | 移除編號提示符,輸出較乾淨 | - |
-d | 預設資料庫(等同 USE db) | -d MyDB |
-E | 使用 Windows 整合驗證(信任連線) | 替代 -U/-P |
-t | 查詢逾時秒數(預設無限) | -t 3600 |
-w | 輸出寬度(預設 80) | -w 500 |
REM 部署批次檔 deploy.bat
@echo off
set SERVER=192.168.1.100\PROD
set DB=ERP_System
set SCRIPT=D:\Release\2024_Q1\Schema_Update.sql
set LOG=D:\Logs\deploy_%date:~-4,4%%date:~-10,2%%date:~-7,2%.log
echo 開始部署 %SCRIPT% 至 %SERVER%.%DB% ...
osql -S %SERVER% -E -d %DB% -i "%SCRIPT%" -o "%LOG%" -b -n -w 500
if %ERRORLEVEL% NEQ 0 (
echo 部署失敗,請檢查日誌 %LOG%
exit /b 1
) else (
echo 部署成功完成。
)
pause
| 特性 | osql | sqlcmd (推薦) |
|---|---|---|
| 支援版本 | SQL 2000~2012 (已淘汰) | SQL 2005+ 至最新版 |
| Unicode 支援 | 不完整 | 完整支援 (-f 65001) |
| 變數替換 | 無 | :setvar / -v |
| 錯誤處理 | 基礎 | :on error、:exit |
| 腳本控制 | 無 | :r 包含檔、!! 執行 OS 指令 |
sqlcmd -S 192.168.1.100\PROD -E -d ERP_System `
-i "D:\Release\Schema_Update.sql" `
-o "D:\Logs\deploy.log" `
-b -h-1 -w 500 -f 65001
-h-1:不列印標題資料列-f 65001:UTF-8 編碼輸入/輸出-v var=value:傳入腳本變數,腳本中用 $(var) 參考GO 批次分隔,避免單一批次過大導致記憶體壓力COMMIT,避免交易日誌暴增掌握 osql/sqlcmd 自動化部署,是 CI/CD 流程、災難恢復演練、大型專案上線的核心技能。