燃燒一小時寶貴青春才查出問題 Orz,PO 文留念。
同事報案,某個用 SQL Agent 定期跑的批次檔 (.bat) 執行無效,原因不明。其寫法類似如下範例,看起來沒什麼問題:
實測開 DOS 視窗直接跑 ImportBOMFromSysA.bat 正常,於是我將偵察方向導向 SQL Agent 執行時工作目錄是 Windows\System32 所致,但檢查該批次檔有依 TIPS-指定主控台應用程式的工作目錄一文所提使用 CD 改路徑技巧,加上其 Log 檔未輸出至 System32,初步排除可能。嘗試手動執行 SQL Agent Job,執行歷程顯示程式執行正常,Exit Code 為 0,代表程式未出錯,而 Log 檔未見相關偵錯訊息軌跡,感覺是程式完全沒執行。
開啟 Process Monitor 觀察,至始至終沒看到讀寫 ImportBOMFromSysA.bat 檔案的記錄,這就不合理了。試將 .bat 檔搬走,SQL Job 居然也沒出錯,一怒之下,將原指令清除改成 D:\Batch\WTF.bat,這才冒出找不到執行檔的錯誤。
回頭再看一次原指令,我似乎懂了什麼。恢復原寫法,將 rem 註解行刪除,ImportBOMFromSysA.bat 便跑了起來。
原來,命令輸入欄雖然可以輸入多行,只有第一行是有效的啊啊啊啊...
理解了這點,下對關鍵字蒐集不少人的踩坑經驗:
- SQL Agent CmdExec gotcha - David Wimbush
- CmdExec job step does not work as desired - SQL Server DBA Diaries
- Execute Multiple Operating System (CmdExec) Commands within One Step of SQL Server Agent
面對此一限制的有效解法是用 && 串接多行指令,但我們的案例第一列是 REM 註解不適用本招,因此我將 REM 移至第二行解決問題。