🧾SSMS 執行 .SQL 檔一直「記憶體不足」?OutOfMemory 完整原因與解法:為什麼改用命令列工具就能成功

 

一、這個錯誤,其實很多公司每天都在發生

如果你在公司負責系統、資料庫或報表,很可能遇過這種情況:

你拿到一個 .sql 檔(可能是資料移轉、系統升級或客戶提供),
打開 SQL Server Management Studio(簡稱 SSMS)按下「執行」。

然後畫面出現:

無法執行指令碼
記憶體不足 
OutOfMemoryException


有時還會看到:

接近 ':' 的語法錯誤


多數人第一反應會是:

  • 是不是 SQL 寫錯?

  • 資料庫壞掉?

  • 伺服器 RAM 不夠?

其實都不是。


二、真正壞掉的不是資料庫,而是「工具」

讓我們用生活比喻。

想像:

  • 資料庫 → 廚房

  • SQL 檔 → 一卡車食材

  • SSMS → 外送員

現在發生的事情是:

廚房其實可以煮,
但外送員試圖一次抱起整卡車的食材。

所以倒下的不是廚房,是外送員。

發生什麼技術上的事情?

當你按「執行」時,SSMS 不會直接交給資料庫。
它會先做一件很關鍵的動作:

先把整個 SQL 檔完整讀進電腦記憶體,再送給資料庫。


如果檔案非常大(例如幾百 MB、幾百萬筆資料):

SSMS 自己就先爆記憶體了。

這就是 OutOfMemoryException。

也就是:

SQL 還沒開始跑,工具先死了。


三、為什麼會出現「:r 語法錯誤」?

很多教學會說可以用一個「讀取外部檔案」的寫法,例如:

:讀取 外部SQL檔

但如果你直接執行,卻看到:

接近 ':' 的語法錯誤


原因很單純:

你現在在「一般查詢模式」,
而這個寫法只在「特殊模式」下才有效。

不過重點來了:

即使開啟該模式,大型檔案仍可能記憶體爆掉,因為 SSMS 還是會嘗試讀取檔案內容。


四、重要觀念:SSMS 不是用來搬大量資料的

SSMS 的設計目的其實是:

  • 查詢資料

  • 寫 SQL

  • 調整資料表

它是一個「開發工具」,不是「資料搬運工具」。

當 SQL 檔包含:

  • 數百萬筆 INSERT

  • 大量歷史資料

  • 系統資料轉移

就超出它的設計範圍了。


五、真正正確的做法:使用命令列執行工具

SQL Server 官方其實提供了一個工具,
專門負責這件事:

命令列資料庫執行器

(工程師通常稱為:資料庫命令列工具)

它和 SSMS 最大差別是:

工具 執行方式
SSMS 一次讀完整檔案
命令列工具 一段一段送給資料庫

因此幾乎不會爆記憶體。


六、實際操作(給完全沒接觸過的人)

步驟 1:打開系統命令視窗

在 Windows:

  1. 按鍵盤 Windows 鍵 + R

  2. 輸入

cmd
  1. 按 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 都遇過的經典問題之一。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)