為何要從 Access 遷移至 SQL Server?
- Access 存取速度較慢,資料量增長時效能明顯下降
- 刪除記錄後留下空洞,檔案膨脹需頻繁「壓縮修復」
- 並發連線數限制嚴重(建議 < 10 併發)
- 檔案損壞風險高,嚴重時無法修復導致資料遺失
- 缺乏企業級安全性、備份還原、高可用性功能
核心語法差異對照表
1. 日期常數格式
| Access | SQL Server |
#1981-12-28# | '1981-12-28' 或 '1981-12-28 00:00:00' |
2. 多表 UPDATE 語法
-- SQL Server(支援 FROM 子句)
UPDATE Tab1
SET a.Name = b.Name
FROM Tab1 a, Tab2 b
WHERE a.ID = b.ID;
-- Access(無 FROM 子句,表列在 UPDATE 後)
UPDATE Tab1 a, Tab2 b
SET a.Name = b.Name
WHERE a.ID = b.ID;
單表 UPDATE 語法相同。
3. DELETE 語法
| Access | SQL Server |
DELETE * FROM table1 WHERE a > 2 | DELETE FROM table1 WHERE a > 2 |
4. 別名(AS)欄位在同一層級的再引用
-- Access:允許直接引用別名
SELECT a, SUM(num) AS kc_num, kc_num * num AS all_kc_num ...
-- SQL Server:不可引用同層別名,需重複運算式或用子查詢/CTE
SELECT a, SUM(num) AS kc_num, SUM(num) * num AS all_kc_num ...
-- 或
SELECT a, kc_num, kc_num * num AS all_kc_num
FROM (SELECT a, SUM(num) AS kc_num FROM ... GROUP BY a) t;
5. 多表聯查的表別名限定符
| Access | SQL Server |
tab1!a | tab1.a(標準點號標記法) |
6. UNION 子查詢必須加別名
-- Access:可無別名
SELECT a,b FROM (SELECT a,b FROM tab1 UNION SELECT c,d FROM tab2) GROUP BY a,b
-- SQL Server:衍生表必須有別名
SELECT a,b FROM (SELECT a,b FROM tab1 UNION SELECT c,d FROM tab2) AS tmptable GROUP BY a,b
7. 布林值表示
| Access | SQL Server |
WHERE True / WHERE 1=1 | WHERE 1=1(標準 SQL) |
遷移實戰關鍵步驟(SQL Server 匯入精靈後處理)
- 自動編號 → 身分識別欄位: 匯入後為
INT,需手動設定 IDENTITY(1,1)
- 文字類型清理: 移除
n 前綴(nvarchar → varchar),除非確需 Unicode
- 日期時間精度: Access 日期匯入為
smalldatetime,需秒精度者改為 datetime 或 datetime2
- 驗證規則/預設值: 重新建立 CHECK 約束與 DEFAULT 約束
- 查詢改寫: 依上表逐一修正應用程式中的 SQL 陳述式
遷移驗證清單
- [ ] 資料筆數核對
- [ ] 關聯完整性(FK)驗證
- [ ] 應用程式功能測試(特別是複雜查詢、報表)
- [ ] 效能基準測試(索引優化、統計資料更新)
- [ ] 安全性設定(登入、角色、權限)
妥善規劃並逐項驗證上述差異,能大幅降低 Access 遷移 SQL Server 的風險與成本。