🍀用命令列批次執行 SQL 腳本失敗怎麼辦?快速看懂「物件已存在」錯誤(以 SQL Server 為例)
前言:為什麼我用「批次執行」SQL 會突然失敗? 很多團隊會把資料庫的更新流程自動化: 例如每天匯入資料、建立報表用的暫存表、或部署新版本時跑一包 SQL 腳本。這類作法常會用「命令列工具」去執行 .sql 檔,因為它可以被排程器呼叫、可以輸出 log、也更容易追蹤成功或失敗。 但新手最常遇到的狀況之一就是: 明明昨天還跑得好好的,今天一跑就報錯,整包流程停住。 其中一個超典型錯誤就是: 「資料庫中已經有一個名為 'XXX' 的物件。」 你看到的錯誤訊息,其實在說什麼? 當 SQL Server 回傳類似這樣的訊息: 已切換到某個資料庫(代表連線成功、也確實在你指定的 DB 內執行) 接著出現「層級 16」的錯誤(代表這是會造成語句失敗的錯誤) 最關鍵句: 「已經有一個名為 'FT_DATALOG_10963' 的物件」 白話翻譯就是: 你的腳本裡正在「建立」一個叫 FT_DATALOG_10963 的東西(可能是資料表/檢視/程序), 但資料庫裡早就有同名物件了,所以 SQL Server 不允許你再建立一次。 這個錯誤最常發生在哪些情境? 你可以把它想成「你想新增一個檔案,但資料夾裡已經有同名檔案」。 以下情境很常見: 你昨天已經跑過一次腳本 物件已存在,今天再跑一次就撞名。 腳本設計成只能跑一次(One-time script) 例如部署用 SQL,作者假設只會在全新環境執行。 你的自動化流程設定成失敗就停止 很多批次工具會在遇到錯誤時直接終止,導致後面 SQL 都不會跑。 為什麼這個錯誤會讓整包流程停止? 在自動化場景中,常見做法是「只要有錯就當作整包失敗」,因為: 資料庫更新通常是連續步驟 中間任何一步失敗,後面可能都會依賴前面的結果 ...