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

OSQL 命令列匯入大型 SQL 腳本檔實戰指南

     編輯:關於SqlServer

當 SQL 腳本檔過大(數百 MB 以上),SSMS 開啟易導致記憶體不足、介面卡死或逾時。osql / sqlcmd 命令列工具直接串流執行,記憶體佔用極低,是大型腳本部署的標準作法。

基本語法

osql -S <伺服器> -U <帳號> -P <密碼> -i <腳本路徑> [-o <輸出日誌>] [-b] [-n]

參數詳細說明

參數說明範例
-S伺服器名稱/IP,具名執行個體用 IP\INSTANCE-S 192.168.1.50\SQL2019
-USQL 登入帳號-U sa
-P密碼(區分大小寫),若省略會提示輸入-P P@ssw0rd
-i輸入腳本檔完整路徑-i D:\Deploy\Schema_v2.sql
-o輸出訊息導向檔案(建議加上)-o D:\Logs\deploy_20240115.log
-b發生錯誤時結束並回傳 ERRORLEVEL批次檔自動化必加
-n移除編號提示符,輸出較乾淨-
-d預設資料庫(等同 USE db)-d MyDB
-E使用 Windows 整合驗證(信任連線)替代 -U/-P
-t查詢逾時秒數(預設無限)-t 3600
-w輸出寬度(預設 80)-w 500

實戰範例

REM 部署批次檔 deploy.bat
@echo off
set SERVER=192.168.1.100\PROD
set DB=ERP_System
set SCRIPT=D:\Release\2024_Q1\Schema_Update.sql
set LOG=D:\Logs\deploy_%date:~-4,4%%date:~-10,2%%date:~-7,2%.log

echo 開始部署 %SCRIPT% 至 %SERVER%.%DB% ...
osql -S %SERVER% -E -d %DB% -i "%SCRIPT%" -o "%LOG%" -b -n -w 500

if %ERRORLEVEL% NEQ 0 (
    echo 部署失敗,請檢查日誌 %LOG%
    exit /b 1
) else (
    echo 部署成功完成。
)
pause

osql vs sqlcmd

特性osqlsqlcmd (推薦)
支援版本SQL 2000~2012 (已淘汰)SQL 2005+ 至最新版
Unicode 支援不完整完整支援 (-f 65001)
變數替換無:setvar / -v
錯誤處理基礎:on error、:exit
腳本控制無:r 包含檔、!! 執行 OS 指令

sqlcmd 現代化寫法

sqlcmd -S 192.168.1.100\PROD -E -d ERP_System `
       -i "D:\Release\Schema_Update.sql" `
       -o "D:\Logs\deploy.log" `
       -b -h-1 -w 500 -f 65001
  • -h-1:不列印標題資料列
  • -f 65001:UTF-8 編碼輸入/輸出
  • -v var=value:傳入腳本變數,腳本中用 $(var) 參考

大型腳本效能優化建議

  1. 批次大小:腳本中適當加入 GO 批次分隔,避免單一批次過大導致記憶體壓力
  2. 交易控制:大量 DML 操作建議分批 COMMIT,避免交易日誌暴增
  3. 並行度:若腳本獨立區塊多,可拆分多檔並行執行(需評估相依性)
  4. 網路:部署機器建議與 SQL Server 同區域網路、高頻寬低延遲

掌握 osql/sqlcmd 自動化部署,是 CI/CD 流程、災難恢復演練、大型專案上線的核心技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved