原系統運行於 DB2,新需求要求支援 SQL Server。採用 PowerDesigner 逆向 → 生成 MSSQL 腳本 → 導入驗證 路徑,**拒絕直接使用 DB2 導出 DDL**,因其包含大量專有語法(如 RESTRICT ON UPDATE)導致 MSSQL 語法報錯。
導入腳本後個別建表失敗,處理流程:
-- DB2 端導出表清單
SELECT tabname FROM syscat.tables WHERE tabschema = 'MYSCHEMA';
-- MSSQL 端導出表清單
SELECT name FROM sysobjects WHERE xtype='U' AND name LIKE 'MYSCHEMA%';
-- 使用 Beyond Compare / WinMerge 對比,定位缺失表,手工補齊 DDL
| DB2 類型 | MSSQL 目標類型 | 備註 |
|---|---|---|
| TIMESTAMP | DATETIME / DATETIME2 | MSSQL TIMESTAMP 是 Rowversion,**不可作時間戳用** |
| CLOB | NVARCHAR(MAX) | 舊版用 NTEXT(已棄用) |
| LONG VARGRAPHIC | NVARCHAR(MAX) | 雙字節大文本 |
| DECIMAL(p,s) | DECIMAL(p,s) | 精度縮放直接對應 |
血淚教訓: MSSQL 單表僅允許 **一個** TIMESTAMP(Rowversion)列,DB2 多 TIMESTAMP 列需全部改為 DATETIME2。
RESTRICT ON UPDATE / RESTRICT ON DELETE → **刪除**,MSSQL 用 FK 定義 ON UPDATE NO ACTIONGENERATED ALWAYS AS IDENTITY → IDENTITY(1,1)FOR EACH ROW MODE DB2SQL (Trigger) → MSSQL 不支持,需改寫為 AFTER INSERT/UPDATE/DELETEMSSQL **全庫範圍內** 主鍵/唯一/外鍵約束名稱**必須唯一**。DB2 僅要求 Schema 內唯一。
解決:統一重命名規範 PK_表名_序號、UQ_表名_列名、FK_表名_引用表_序號,腳本層面批量替換。
DESC 為 MSSQL 保留字(DESCending)。臨時方案:雙引號 "DESC" 或重命名 DESCPT。建議重命名,避免後續 ORM/報表工具踩坑。
-- 1. 類型替換
sed -i 's/\bTIMESTAMP\b/DATETIME2/g' ddl.sql
sed -i 's/\bCLOB\b/NVARCHAR(MAX)/g' ddl.sql
sed -i 's/\bLONG VARGRAPHIC\b/NVARCHAR(MAX)/g' ddl.sql
-- 2. 刪除 DB2 專有約束語法
sed -i '/RESTRICT ON UPDATE/d' ddl.sql
sed -i '/RESTRICT ON DELETE/d' ddl.sql
-- 3. 約束重命名(示例:主鍵)
awk '/PRIMARY KEY/ {gsub(/CONSTRAINT [^ ]+/, "CONSTRAINT PK_" FILENAME "_" ++i)} 1' ddl.sql
CREATE VIEW ... WITH CHECK OPTION → MSSQL 兼容性測試DECLARE GLOBAL TEMPORARY TABLE、COMPOUND SQL、錯誤處理 CONTINUE HANDLER 差異db2move export → bcp/SSIS 導入,LOB 分文件處理異構遷移核心是**「語義等價而非語法翻譯」**。Day 1 完成表結構落地,為後續代碼層遷移鋪平基石。