大批量遷移 Oracle 預存程序至 SQL Server 時,可先用編輯器執行下列 正則/字串替換,再人工微調,可節省 80% 以上機械轉換工時。
| # | Oracle 寫法 | SQL Server 寫法 | 備註 |
|---|---|---|---|
| 1 | CREATE OR REPLACE PROCEDURE | CREATE PROCEDURE | 移除 OR REPLACE |
| 2 | 變數 user_id | @user_id | 所有變數加 @ 前綴 |
| 3 | IS | AS | 並將 BEGIN 上移至 AS 直後 |
| 4 | CURSOR cur_a IS ... | DECLARE cur_a CURSOR LOCAL FOR ... | 游標宣告語法差異 |
| 5 | FETCH cur_a INTO ... | FETCH NEXT FROM cur_a INTO ... | 需加 NEXT |
| 6 | IF (cur_a%NOTFOUND) THEN | IF (@@FETCH_STATUS <> 0) BEGIN | 狀態檢查方式不同 |
| 7 | IF (cur_a%FOUND) THEN | IF (@@FETCH_STATUS = 0) BEGIN | |
| 8 | ; (陳述式結束) | (空格/換行) | TSQL 不以分號結束,但建議保留分號作風格 |
| 9 | := | = | 指派運算子,並手動補上 SET |
| 10 | THEN | BEGIN | IF ... THEN → IF ... BEGIN |
| 11 | END IF; | END | |
| 12 | IN (參數模式) | (移除) | TSQL 參數預設輸入,無 IN 關鍵字 |
| 13 | NVL(a,b) | ISNULL(a,b) | |
| 14 | SYSDATE | GETDATE() | |
| 15 | VARCHAR2 | VARCHAR | 需手動補長度,如 VARCHAR(100) |
| 16 | ELSIF | ELSE IF | |
| 17 | || (字串連接) | + |
EXCEPTION WHEN ... → SQL Server TRY...CATCH 結構差異大,需重寫。DBMS_SQL、TABLE OF ...、%ROWTYPE 等無對應物件,需改用暫存表或 Table-Valued Parameter。EXECUTE IMMEDIATE → sp_executesql,參數綁定語法不同。SYSDATE + 1 → DATEADD(DAY, 1, GETDATE())。SEQ.NEXTVAL → IDENTITY 或 SEQUENCE (2012+)。工具建議:使用 SQLines、AWS SCT 或 SSMA for Oracle 輔助轉換,再套用上表規則做二次清洗。