首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

sqlcmd 批次檔自動化實戰:參數傳入、結果捕獲與變數回寫

     編輯:關於SqlServer

核心參數速查

參數用途範例
-E信任連線 (Windows 驗證)-E
-U/-PSQL 驗證帳號/密碼-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
  • 腳本中用 `$(VarName)` 參照。
  • `-v` 定義值;若未定義,sqlcmd 會依序搜尋:系統環境變數 → 使用者環境變數 → 批次檔 `SET` 變數。

場景二:捕獲單一值回批次變數 (關鍵技巧)

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`。

最佳實務清單

  1. 生產環境腳本務必加 `-b -V16` 確保失敗可被排程偵測。
  2. 敏感密碼勿寫在批次檔,改用 `-E` 或 SQL 驗證配合 Windows 認證代理帳號。
  3. 長時間執行腳本加上 `-t 0` (查詢逾時無限) 或具體秒數。
  4. 輸出檔加上時間戳記避免覆蓋,便於稽核追蹤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved