| 參數 | 用途 | 範例 |
|---|---|---|
| -E | 信任連線 (Windows 驗證) | -E |
| -U/-P | SQL 驗證帳號/密碼 | -U sa -P pwd |
| -S | 伺服器[\實例名] | -S .\SQL2019 |
| -d | 資料庫名稱 | -d AdventureWorks |
| -Q | 執行查詢並結束 (推薦批次用) | -Q "SELECT GETDATE()" |
| -i/-o | 輸入/輸出檔案 | -i script.sql -o log.txt |
| -v | 定義腳本變數 | -v DBName=Test |
| -W | 移除尾部空白 (輸出更緊湊) | -W |
| -x | 禁用變數替換 (含 $(var) 字面字串時) | -x |
sqlcmd -d TestDB -Q "SELECT * FROM dbo.Investment WHERE Investor = $(Comp)" -v Comp='IBM' -W
sqlcmd 無直接 `OUTPUT` 參數,但可透過 `PRINT` + 重導向 + `SET /P` 實現:
@echo off
REM 1. 執行查詢,僅 PRINT 目標值,導向暫存檔
sqlcmd -d TestDB -Q "DECLARE @d NVARCHAR(8); SELECT @d = MAX(LogDate) FROM dbo.LogDates; PRINT @d;" -W > lastdate.txt
REM 2. 將檔案第一行讀入批次變數
set /p LastLogDate= < lastdate.txt
REM 3. 後續使用 %LastLogDate%
echo 最後處理日期 = %LastLogDate%
REM 可用於動態建構下一步匯入命令等
原理:`PRINT` 輸出至 STDOUT,`>` 重導向至檔案,`SET /P var=場景三:動態建構與執行大型腳本
sqlcmd -S .\INST -d Master -i "C:\Deploy\CreateObjects.sql" -o "C:\Logs\Deploy_%DATE%.log" -b -V16
- `-b`:遇錯誤立即結束並回傳 ERRORLEVEL。
- `-V16`:嚴重性 ≥ 16 視為錯誤觸發 `-b`。
最佳實務清單
- 生產環境腳本務必加 `-b -V16` 確保失敗可被排程偵測。
- 敏感密碼勿寫在批次檔,改用 `-E` 或 SQL 驗證配合 Windows 認證代理帳號。
- 長時間執行腳本加上 `-t 0` (查詢逾時無限) 或具體秒數。
- 輸出檔加上時間戳記避免覆蓋,便於稽核追蹤。