sql server t-sql腳本轉成oracle plsql

將一份SQL SERVER數據庫生成的T-SQL腳本,轉成ORACLE的PL/SQL,其複雜繁瑣程度,遠遠出乎個人意料。正則表達式

這份SQL SERVER腳本,裏面有表,有視圖,還有存儲過程,以及一些自定義函數。目前,僅勉強將表、視圖移植到oracle,存儲過程和自定義函數,只能先放棄了。sql

總結以下:數據庫

1、轉換工具
oracle自帶工具:Oracle SQL Developer。選工具 -「移植」- 草稿編輯器
這裏寫圖片描述ruby

在下拉框中選擇 T-SQL 到 PL/SQL(默認)
這裏寫圖片描述markdown

有個地方要特別注意,也是這個工具比較腦殘的地方,T-SQL腳本必定要經過粘貼的途徑輸入到左邊的輸入框,這樣纔有轉換的界面;假如你經過打開文件的方式,系統會把它當成PLSQL,根本沒有下拉框出來。我剛開始就是直接打開腳本文件,心想怎麼跟網上說的對不上號,幾番折騰,才發現這個轉換的功能。oracle

我還下載了一個名叫「IspirerMnMTK」的東東,根本安裝不上,換了幾臺機器都不行,不知道啥垃圾。編輯器

2、轉換
一、這個ORACLE自帶的工具轉換功能並不是萬能,好多T-SQL語句都沒法識別。函數

有這些語句存在,它就亂譯一通,根本沒法執行。好比一些選項,一些字段註釋,甚至一些代碼註釋工具

SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HDBH_BHGH_TJ_PROPVALUE]') AND type in (N'U')) EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'海嘯發生次數' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'HDTJ_FORM_TJ9', @level2type=N'COLUMN', @level2name=N'TSU_TIMES'

諸如此類
像這種狀況,只有先自行去掉,再給工具翻譯。spa

二、ORACLE不支持
我此次遇到的有兩個:
1)NVARCHAR(MAX)
工具翻譯成 NVARCHAR2(4000)。問題是,假如一張表裏,有2個或以上這樣的字段,ORACLE建表時就報字段超長的錯。並且,竊覺得翻譯成NVARCHAR2(4000)也是不許確的,因此手動改成clob。

2)標識符超長
我拿到的SQL SERVER腳本,有些字段名字起的很是長,而oracle只能支持30個字符之內,因此,也要手動修改。

3、執行
好不容易翻譯好的腳本,如何執行?

用PLSQL Developer的SQL窗口,只能執行頭三條語句;應當用命令窗口。但命令窗口對格式要求又比較嚴,有時出現一段SQL腳本,斷句報錯的狀況。

還有就是,像這種以END;結束的,必定要另起一行,來個「/」。如:

CREATE OR REPLACE TRIGGER EVSYS_SETUPGUIDE_ID_TRG BEFORE INSERT ON EVSYS_SETUPGUIDE FOR EACH ROW BEGIN SELECT EVSYS_SETUPGUIDE_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
   END;
/

4、總結
轉換工具並不是萬能,儘可能精簡以後再進行翻譯;翻譯以後,還要進行修正。我最終,仍是寫了一個工具來作這些輔助工做。好比,字段註釋,能夠在自行開發的工具裏使用正則表達式進行自動替換:

--SQL SERVER 的字段註解
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'海嘯發生次數' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'HDTJ_FORM_TJ9', @level2type=N'COLUMN', @level2name=N'TSU_TIMES'
--oracle 的字段註解
COMMENT ON COLUMN "PCB_HDDM2"."TJDISTCODE" IS '用於統計的行政區劃代碼';

替換的正則表達式

EXEC\s+sys\.sp_addextendedproperty\s+@name=N'MS_Description',\s+@value=N'(?<Comment>[^']+)'\s*,\s+@level0type=N'SCHEMA',@level0name=N'dbo',\s+@level1type=N'TABLE',@level1name=N'(?<Table>[^']+)',\s+@level2type=N'COLUMN',@level2name=N'(?<Column>[^']+)' 替換成: COMMENT ON COLUMN "${Table}"."${Column}" IS '${Comment}';
相關文章
相關標籤/搜索