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

SQL Server 高版本資料庫降級至低版本完整實戰:腳本產生與資料遷移

     編輯:關於SqlServer

SQL Server 不支援直接備份/還原或分離/附加從高版本降級至低版本 (如 2008 R2 → 2008、2012 → 2008 R2)。嘗試還原會報錯:資料庫 'xxx' 無法還原,因為它是由較新版本的伺服器建立的...。本文提供兩種經實測可行的降級方案。

錯誤訊息範例

版本號對照:SQL 2008 = 10.00.xxxx、SQL 2008 R2 = 10.50.xxxx、SQL 2012 = 11.00.xxxx、SQL 2014 = 12.00.xxxx、SQL 2016 = 13.00.xxxx、SQL 2017 = 14.00.xxxx、SQL 2019 = 15.00.xxxx。

方法一:SSMS 產生腳本 + 匯入資料 (圖形化操作,推薦)

  1. SSMS 連接高版本伺服器 → 右鍵目標資料庫 → 「工作」→「產生指令碼」。
  2. 選擇「指定指令碼選項」→ 進階設定:
  3. 關鍵進階選項:
選項建議值說明
指令碼目標資料庫引擎版本目標低版本 (如 SQL Server 2008)產生相容語法
資料類型指令碼編寫True包含資料
索引/觸發器/條件約束/權限True完整結構
ANSI 填補/NULL 行為True相容性
  1. 儲存腳本檔 (.sql) → 在低版本 SSMS 開啟並執行,建立空資料庫結構。
  2. 低版本 SSMS → 右鍵資料庫 → 「工作」→「匯入資料」→ 來源選高版本伺服器/資料庫 → 目的地選當前低版本資料庫 → 全選資料表 → 執行匯入。

方法二:sp_dbcmptlevel 相容性層級 (僅限版本間相容性調整,非真降級)

注意:此方法不改變資料庫內部版本號,僅調整查詢最佳化器行為相容性。無法解決備份/還原版本不符問題。Microsoft 已宣告棄用,建議改用 ALTER DATABASE SET COMPATIBILITY_LEVEL。

-- 查詢目前相容性層級
EXEC sp_dbcmptlevel 'MyDatabase';

-- 設定為 SQL Server 2008 (100)
EXEC sp_dbcmptlevel 'MyDatabase', 100;

-- 對應值:80=2000, 90=2005, 100=2008, 110=2012, 120=2014, 130=2016, 140=2017, 150=2019

內部實現原理 (sp_dbcmptlevel)

-- 核心執行動態 SQL
SET @exec_stmt = 'ALTER DATABASE ' + QUOTENAME(@dbname, '[') + ' SET COMPATIBILITY_LEVEL = ' + CAST(@input_cmptlevel AS NVARCHAR(128))
EXEC(@exec_stmt)

方案選擇建議

需求推薦方案理由
正式環境遷移、版本差距大方法一 (腳本+匯入)徹底重建低版本資料庫檔案,支援跨大版本 (如 2019→2008)
開發/測試環境、版本相近方法一 (腳本+匯入)同樣最穩妥
僅需調整查詢行為相容性ALTER DATABASE COMPATIBILITY_LEVEL無需遷移資料,即時生效

常見坑點與解決

  • 腳本過大無法在 SSMS 開啟:用 sqlcmd -i script.sql -S server -d db 執行。
  • 匯入資料時身分識別欄位衝突:啟用「保留身分識別值」或先 SET IDENTITY_INSERT ON。
  • 使用者/權限未遷移:腳本選項勾選「登入/使用者/權限/角色」,或使用 sp_help_revlogin 腳本遷移登入帳號。
  • Filestream/FileTable/Columnstore 等新功能:低版本不支援,腳本產生會失敗或忽略,需手動移除相關物件後再產生腳本。

掌握「產生腳本 + 匯入資料」標準流程,即可應對所有 SQL Server 版本降級遷移需求。

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