Access 升級 SQL Server 是經典遷移場景,但兩者在類型系統、函數庫、SQL 方言、引擎行為上存在大量差異,直接導入常導致應用報錯、數據截斷、邏輯偏差。本文匯總 20+ 關鍵差異點,提供對照修正表與驗證清單。
| 類別 | Access 行為 | SQL Server 行為 | 修正動作 |
| 自動編號/標識列 | AutoNumber 類型,自動生成 | 無自動遷移為 IDENTITY,需手動聲明 | 建表腳本加 ID INT IDENTITY(1,1) PRIMARY KEY |
| 種子/增量固定 | 可指定種子/增量 | IDENTITY(seed, increment) 同等支持 | 保持原種子增量配置 |
| 插入時可顯式指定值 | 允許 | 需 SET IDENTITY_INSERT Table ON | 遷移腳本開啟 IDENTITY_INSERT 批量導入 |
| 日期時間類型 | Date/Time (雙精度浮點,含日期時間) | smalldatetime (4字節,精度分鐘) / datetime (8字節,精度 3.33ms) | 統一遷移為 DATETIME2(3) 或 DATETIME,範圍更大、精度更高 |
| Now()/Date()/Time() 函數 | 內建 | 無此函數,用 GETDATE() / CAST(GETDATE() AS DATE) / CAST(GETDATE() AS TIME) | 全局搜索替換:Now→GETDATE, Date→CAST(GETDATE() AS DATE), Time→CAST(GETDATE() AS TIME) |
| 日期運算 | DateDiff('d', d1, d2) 字符串間隔 | DATEDIFF(day, d1, d2) 枚舉常量 | 間隔參數去引號:'d'→day, 'm'→month, 'yyyy'→year |
| DateAdd('d', n, dt) | 字符串間隔 | DATEADD(day, n, dt) | 同上 |
| 布爾/邏輯類型 | Yes/No (-1/0),可直接判斷 | BIT (1/0/NULL),不可隱式轉換為布爾 | 列類型改 BIT,代碼中 True→1, False→0, 判斷改 WHERE Flag = 1 |
| 備注/長文本 | Memo (無長度限制) | VARCHAR(MAX) / NVARCHAR(MAX) | 遷移為 MAX 類型,查詢用 CAST(MemoCol AS NVARCHAR(MAX)) 參與運算 |
| 游標類型 | 默認動態游標 | 默認前向只讀,需顯式指定 CURSOR_TYPE = 1 (Keyset) 或 2 (Dynamic) | ADO 連接/記錄集打開時指定 CursorType = adOpenKeyset (1) |
| NULL 判斷 | IsNull(Col) 函數 | IS NULL / IS NOT NULL 操作符 | 替換 IsNull(Col) → Col IS NULL |
| 刪除語法 | DELETE * FROM Table WHERE ... | DELETE FROM Table WHERE ... (無 *) | 去除 * |
| VB/VBA 函數調用 | SQL 中可直接用 CStr(), Format(), IIf() 等 | 不可用,需改用 T-SQL 對應:CAST/CONVERT, FORMAT(), CASE/IIF() (2012+) | 建立標量函數映射庫或應用層轉換 |
| 通配符 | * (任意字符), ? (單字符), # (單數字) | % (任意), _ (單字符), [] (範圍), [^] (排除) | LIKE 模式全量替換:*→%, ?→_ |
| 字符串連接 | & 或 + | + (需處理 NULL 導致結果 NULL) | 用 CONCAT() (2012+) 或 ISNULL(col,'') + ... |
| 顯式事務 | Workspace.BeginTrans/CommitTrans | BEGIN TRAN / COMMIT / ROLLBACK | ADO 連接對象 BeginTrans/CommitTrans/RollbackTrans 同介面 |
| 參數化查詢 | Parameters 集合位置參數 ? | 命名參數 @ParamName | ADO Command 對象統一支援命名參數,重構參數綁定邏輯 |
遷移驗證清單
- 結構對比:
sp_help 'TableName' vs Access 設計視圖,逐列核對類型、長度、精度、標識、默認值、非空約束。
- 數據完整性:行數、主鍵唯一性、外鍵引用完整性、CHECK 約束驗證、NULL 分佈對比。
- 查詢語義:核心業務 SQL 逐條在兩端執行,結果集行數、列值、排序逐行對比(工具:Redgate SQL Data Compare / 自編腳本)。
- 應用測試:ADO/ODBC 連接字符串切換,跑全量回歸用例,重點驗證:游標行為、參數綁定、日期邏輯、字符串連接、NULL 處理。
- 性能基線:關鍵查詢執行計劃、IO、CPU、耗時對比,識別退化查詢優化(索引、統計信息、參數嗅探)。
自動化遷移工具鏈推薦
| 工具 | 優點 | 缺點 | 適用場景 |
| SSMA (SQL Server Migration Assistant for Access) | 官方免費、結構/數據/查詢轉換、評估報告 | 複雜 VBA 函數轉換有限、大對象需人工干預 | 標準遷移首選 |
| Access 內建「上傳至 SQL Server」嚮導 | 零安裝、圖形化、小庫快速 | 無評估報告、類型映射死板、不支持 .accdb 新特性 | 臨時小庫 |
| 自建 ETL (SSIS / Python / C#) | 完全可控、可嵌入業務轉換邏輯 | 開發維護成本高 | 複雜改造、持續同步 |
總結
Access → SQL Server 遷移的核心難點不在數據搬運,而在語義等價性保證:日期函數、布爾邏輯、字符串連接、NULL 語法、通配符、VB 函數調用等隱性差異。建議採用 SSMA 評估 → 結構手工修正腳本 → 數據分批導入 → 核心 SQL 雙端回歸 → 應用全量測試 的標準化流程,將遷移風險控制在可接受範圍內。
- 上一篇文章: 跨平台 MySQL 導出 Excel 工具:Perl + Spreadsheet::WriteExcel::Big 實現大文件生成
- 下一篇文章: SQL Server PRINT 語句導致客戶端異常斷開的離奇案例與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved