sqlcmd 是 SQL Server 2005 引入的新一代命令列工具,取代舊版 osql 與 isql,支援互動模式、腳本執行、變數替換、輸出導向、錯誤處理、效能追蹤等企業級自動化需求。本文系統整理核心用法與實戰技巧。
C:\> sqlcmd
1> SELECT name FROM sys.databases;
2> GO
Changed database context to 'master'.
name
------------------------------
master
tempdb
model
msdb
(4 rows affected)
1> :ServerList
SERVERS:
MYSERVER\INSTANCE1
MYSERVER\INSTANCE2
1> :Help
... 顯示所有內部命令 ...
1> QUIT
常用內部命令:
| 命令 | 功能 |
|---|---|
| :ServerList | 列出網路上可見的 SQL Server 執行個體 |
| :Help / :? | 顯示說明 |
| :QUIT / :EXIT | 離開 |
| :OUT file|STDOUT|STDERR | 設定結果輸出目的地 |
| :ERROR file|STDOUT|STDERR | 設定錯誤輸出目的地 |
| :PERFTRACE file|STDOUT|STDERR | 設定效能追蹤輸出 |
| :CONNECT server[\instance] [timeout] [user [pwd]] | 切換連線 |
| :ON ERROR [EXIT|IGNORE] | 錯誤處理模式 |
| :SETVAR var value | 設定腳本變數 |
| :LISTVAR | 列出目前所有變數 |
| :r file | 載入並執行外部腳本檔 |
| :XML ON/OFF | 切換 XML 輸出格式 |
sqlcmd -i script.sql -o output.txt
sqlcmd
1> :OUT results.txt
2> :r script.sql
3> GO
參數說明:
-i:輸入腳本檔-o:輸出結果檔-e:回顯輸入腳本內容-h:標題列重複間隔列數-s:資料欄分隔字元 (預設空白)-w:螢幕寬度 (預設 80)-W:移除尾端空白-k:保留控制字元
SET NOCOUNT ON;
SELECT $(Cols) FROM $(TableName);
GO
sqlcmd -i script.sql -o out.txt -v Cols="name,object_id,create_date" TableName="sys.objects"
USE master;
BACKUP DATABASE [$(db)] TO DISK='$(file)';
:SETVAR db msdb
:SETVAR file C:\Backup\msdb.bak
:r backuptemplate.sql
:LISTVAR 可檢視目前所有變數 (含環境變數衍生)。
| 環境變數 | sqlcmd 參數 | 說明 |
|---|---|---|
| SQLCMDSERVER | -S | 伺服器名稱 |
| SQLCMDUSER | -U | 登入帳號 |
| SQLCMDPASSWORD | -P | 密碼 (不安全,建議用整合驗證) |
| SQLCMDDBNAME | -d | 預設資料庫 |
| SQLCMDLOGINTIMEOUT | -l | 登入逾時秒數 |
| SQLCMDSTATTIMEOUT | -t | 查詢逾時秒數 |
| SQLCMDPACKETSIZE | -a | 封包大小 |
| SQLCMDHEADERS | -h | 標題重複間隔 |
| SQLCMDCOLSEP | -s | 欄分隔字元 |
| SQLCMDCOLWIDTH | -w | 螢幕寬度 |
| SQLCMDERRORLEVEL | -m | 錯誤等級閾值 |
| SQLCMDWORKSTATION | -H | 工作站名稱 |
:SETVAR dbname MyDB
:SETVAR bakpath D:\Backup
:SETVAR dateval $(ESCAPE_SQUOTE($(DATE)))
USE master;
DECLARE @fn NVARCHAR(260) = '$(bakpath)\$(dbname)_$(dateval).bak';
BACKUP DATABASE [$(dbname)] TO DISK = @fn WITH INIT, COMPRESSION, CHECKSUM;
GO
搭配 Windows 排程器 / SQL Agent CmdExec 作業:
sqlcmd -S . -E -i daily_backup.sql -v dateval=%DATE:~-10,4%%DATE:~-4,2%%DATE:~-7,2%
:ON ERROR EXIT:遇錯誤立即結束,回傳錯誤碼。:ON ERROR IGNORE:忽略錯誤繼續 (預設)。-b 參數:批次模式下遇錯誤立即結束並回傳錯誤碼。-f 65001 (UTF-8) / -f 1200 (Unicode) 指定代碼頁。sqlcmd -U user -P * 互動輸入。BCP 或 BULK INSERT 效能更佳;sqlcmd 適合 DDL、維護、小量資料搬移。