🧾SSMS 執行 .SQL 檔一直「記憶體不足」?OutOfMemory 完整原因與解法:為什麼改用命令列工具就能成功
一、這個錯誤,其實很多公司每天都在發生
如果你在公司負責系統、資料庫或報表,很可能遇過這種情況:
你拿到一個
.sql
檔(可能是資料移轉、系統升級或客戶提供),
打開 SQL Server Management Studio(簡稱
SSMS)按下「執行」。
然後畫面出現:
無法執行指令碼記憶體不足
有時還會看到:
接近 ':' 的語法錯誤
多數人第一反應會是:
-
是不是 SQL 寫錯?
-
資料庫壞掉?
-
伺服器 RAM 不夠?
其實都不是。
二、真正壞掉的不是資料庫,而是「工具」
讓我們用生活比喻。
想像:
-
資料庫 → 廚房
-
SQL 檔 → 一卡車食材
-
SSMS → 外送員
現在發生的事情是:
廚房其實可以煮,
但外送員試圖一次抱起整卡車的食材。
所以倒下的不是廚房,是外送員。
發生什麼技術上的事情?
當你按「執行」時,SSMS 不會直接交給資料庫。
它會先做一件很關鍵的動作:
先把整個 SQL 檔完整讀進電腦記憶體,再送給資料庫。
如果檔案非常大(例如幾百 MB、幾百萬筆資料):
SSMS 自己就先爆記憶體了。
這就是 OutOfMemoryException。
也就是:
SQL 還沒開始跑,工具先死了。
三、為什麼會出現「:r 語法錯誤」?
很多教學會說可以用一個「讀取外部檔案」的寫法,例如:
:讀取 外部SQL檔
但如果你直接執行,卻看到:
接近 ':' 的語法錯誤
原因很單純:
你現在在「一般查詢模式」,
而這個寫法只在「特殊模式」下才有效。
不過重點來了:
即使開啟該模式,大型檔案仍可能記憶體爆掉,因為 SSMS 還是會嘗試讀取檔案內容。
四、重要觀念:SSMS 不是用來搬大量資料的
SSMS 的設計目的其實是:
-
查詢資料
-
寫 SQL
-
調整資料表
它是一個「開發工具」,不是「資料搬運工具」。
當 SQL 檔包含:
-
數百萬筆 INSERT
-
大量歷史資料
-
系統資料轉移
就超出它的設計範圍了。
五、真正正確的做法:使用命令列執行工具
SQL Server 官方其實提供了一個工具,
專門負責這件事:
命令列資料庫執行器
(工程師通常稱為:資料庫命令列工具)
它和 SSMS 最大差別是:
| 工具 | 執行方式 |
|---|---|
| SSMS | 一次讀完整檔案 |
| 命令列工具 | 一段一段送給資料庫 |
因此幾乎不會爆記憶體。
六、實際操作(給完全沒接觸過的人)
步驟 1:打開系統命令視窗
在 Windows:
-
按鍵盤 Windows 鍵 + R
-
輸入
cmd
-
按 Enter
會出現黑色視窗(這叫命令提示字元)。
步驟 2:執行 SQL 檔
下面為示例格式:
資料庫工具 -伺服器 你的主機 -資料庫 目標DB -輸入 "D:\資料\匯入檔.sql"
如果需要帳號密碼:
資料庫工具 -伺服器 你的主機 -使用者 帳號 -密碼 密碼 -輸入 "D:\資料\匯入檔.sql"
步驟 3:記錄執行結果(很重要)
建議同時產生執行紀錄檔:
資料庫工具 ... -輸出 "D:\執行紀錄.txt"
好處:
-
失敗時能找到是哪一段 SQL 出錯
-
不用再猜原因
七、為什麼這個方法有效?
這個工具的原理是:
串流執行(Streaming)
意思是:
不是一次把全部資料載入記憶體,
而是像水管一樣,一點一點送到資料庫。
所以:
-
幾 GB 的 SQL 檔也能跑
-
幾百萬筆資料也可處理
-
記憶體不會爆
八、很多人不知道的事
如果你的
.sql 檔其實是整個系統資料:
最佳方法甚至不是 SQL。
更專業的方式是:
-
備份還原(最快)
-
批次匯入工具(最穩)
SQL Script 其實只適合「結構與小量資料」。
九、如何判斷你遇到的是這個問題?
只要看到以下任何一個:
-
OutOfMemoryException
-
記憶體不足
-
無法執行指令碼
-
巨大 SQL 執行卡死
-
編輯器凍結
-
接近 ':' 語法錯誤
幾乎可以確定:
不是資料庫壞,是工具不適合。
十、總結(工程師給初學者的建議)
| 任務 | 建議工具 |
|---|---|
| 查資料 | SSMS |
| 改表結構 | SSMS |
| 小量資料 | SSMS |
| 大量資料匯入 | 命令列工具 |
| 整庫搬移 | 備份還原 |
最重要的一句話:
當 SQL 檔很大時,不要再嘗試用 SSMS 執行。換工具,比升級硬體更有效。
如果你曾經為這個錯誤查了一整天,其實不是你不會。
這是很多公司 DBA 都遇過的經典問題之一。
留言
張貼留言