查詢系統映射視圖
-- SQL Server → Oracle 類型映射(高層)
SELECT * FROM msdb.dbo.MSdatatype_mappings;
-- 詳細映射(含源/目標類型、精度、縮放、可空性)
SELECT * FROM msdb.dbo.sysdatatypemappings;
核心映射對照表(節選常用類型)
| SQL Server 類型 | Oracle 類型 | 備註 |
| bigint | NUMBER(19) | |
| binary / varbinary / image | BLOB / RAW | BLOB 對應 MAX 長度,RAW 對應定長 |
| bit | NUMBER(1) | |
| char / varchar / text | CHAR / VARCHAR2 / CLOB | MAX 長度類型映射為 CLOB |
| datetime / smalldatetime | DATE | Oracle DATE 含時間 |
| decimal / numeric | NUMBER(p,s) | 精度縮放保留 |
| float / real | FLOAT / REAL | |
| int | NUMBER(10) | |
| money / smallmoney | NUMBER(19,4) / NUMBER(10,4) | 固定 4 位小數 |
| nchar / nvarchar / ntext | NCHAR / NVARCHAR2 / NCLOB | Unicode 類型 |
| uniqueidentifier | CHAR(38) | 含花括號與連字符 |
| timestamp | RAW(8) | Rowversion 二進制 |
| tinyint | NUMBER(3) | |
| xml | NCLOB / XMLTYPE | Oracle 11g+ 支持 XMLTYPE |
遷移關鍵注意點
- MAX 類型(
varchar(max)、nvarchar(max)、varbinary(max))→ Oracle CLOB/NCLOB/BLOB,無長度限制
- 日期時間:SQL Server
datetime 精度 3.33ms,Oracle DATE 精度 1s,TIMESTAMP 精度納秒;遷移高精度時間需用 TIMESTAMP(3)
- 標識列:SQL Server
IDENTITY → Oracle Sequence + Trigger 或 12c+ GENERATED AS IDENTITY
- 唯一標識符:
uniqueidentifier → RAW(16) 存儲更緊湊,或 CHAR(36) 可讀
- 位數據:
bit → NUMBER(1) 或 CHAR(1) ('Y'/'N')
- 大對象:
text/ntext/image 已棄用,新開發用 varchar(max)/nvarchar(max)/varbinary(max),Oracle 對應 CLOB/NCLOB/BLOB
實用查詢:生成建表腳本映射
SELECT
s.name AS sql_type,
o.name AS oracle_type,
m.precision, m.scale, m.nullable
FROM msdb.dbo.sysdatatypemappings m
JOIN sys.systypes s ON m.src_type = s.xusertype
JOIN sys.systypes o ON m.dest_type = o.xusertype
WHERE m.mapping_id IN (SELECT mapping_id FROM msdb.dbo.MSdatatype_mappings WHERE dest_dbms = 'Oracle');
工具輔助
- SQL Server Migration Assistant for Oracle (SSMA):微軟官方免費工具,自動評估、轉換、遷移,強烈推薦
- Oracle SQL Developer:Oracle 官方工具,含「遷移工作台」反向支持
最佳實踐
- 跑 SSMA 評估報告,收集無法自動轉換的類型/代碼
- 對照
sysdatatypemappings 手動確認核心表映射
- 大對象字段單獨測試導入性能與完整性
- 標識列改用 Sequence,重寫依賴
@@IDENTITY/SCOPE_IDENTITY() 的邏輯
- 測試環境全量演練,驗證數據精度、截斷、編碼