從Oracle遷移到SQL Server的陷阱

2021-05-25 11:26:14 字數 2363 閱讀 9987

在把oracle查詢轉換為sql server的時候要特別當心一些不容易注意到的問題。我們知道,t-sql是sql server的語言引擎,而oracle的語言引擎卻是plsql。這兩種查詢語言都對ansi sql-92標準進行了擴充套件以提供額外的支援力度。你所建立的應用程式幾乎都要用到這些補充特性。本文就對最常用的、非標準的oracle擴充套件進行了說明,同時還要介紹下如何對這些擴充套件進行轉化以用在sql server環境下。

列的選擇

用plsql執行資料查詢的時候,from子句是必須的,這同sql server的要求是一樣的。 select語句必須選擇針對的資料表。在oracle資料庫內有一種特殊的表dual。dual表由oracle連同資料字典一同建立,所有的使用者都可以用名稱dual訪問該錶。這個表裡只有一列dummy,該列定義為varchar2(1)型別,有一行值x。

從dual表選擇資料常被用來通過select語句計算常數表示式,由於dual只有一行資料,所以常數只返回一次。

oracle下的dual查詢如下所示:

select  『x』 from dual

而對等的sql server查詢則是下面這個樣子:

select 『x』 連線

oracle用|| 符號作為連線符,而sql server的連線符是加號:+ 。

oracle查詢如下所示:

select 『name』 || 『last name』 from tablename

對應的sql server查詢如下所示:

select 『name』 + 『last name』

數字取捨

oracle資料庫內有乙個trunc函式,該函式返回m位十進位制數的n位;如果省略m則n就是0位。m的值可以為負,表示截去小數點左邊m位數字。

在sql server下可以用round或者floor。

以下是oracle查詢:

select  trunc(15.79,1) "truncate" from dual;

下面是同類查詢的sql server版本:

select round(15.79, 0) rounded , round(15.79, 0,1) truncated

select floor(round(15.79, 0)), floor(round(15.79, 0,1) )

數字轉換

oracle的to_char函式可以把n位number資料型別轉換為varchar2 資料型別,同時採用可選的數字格式。

sql server則通過str函式返回數字轉換之後的字元資料。不過,該函式不具方便的format引數。

oracle查詢如下:

select to_char(123.45 ,99999999999999) from tab

select to_char(expiry_date,'ddmonyyyy') from tab

以下是sql server版本的查詢:

select str(123.45, 14)

select str(round(123.455 , 2),12,2)

select cast(replace((convert(varchar(12) , expirydate, 106 )),' ' , '') as varchar(9))

length和len

以下是oracle的查詢:

select length('sqlmag') "length in characters" from dual;

以上查詢在sql server下是這樣寫的:

select len('sqlmag') "length in characters" 日期

以上兩種系統都具有各自的當前日期和時間格式。

oracle取得日期和採用如下方式:

sysdate

sql server則是這樣的:

getdate()

你可以用各種語法操作日期。以下的**對oracle日期值中的月份進行了格式調整(返回日期再加上n月):

select   add_months(sysdate,12) from dual

sql server則是如下完成同等功能的:

select dateadd(mm,12,getdate())

資料的減法也不同。以下**在oracle中直接對資料進行減法操作:

select sysdate -add_months(sysdate,12) from dual

sql server則是這樣做的:

select  datediff(dd, getdate(),dateadd(mm,12,getdate())) 小結

幸而,我在從oracle遷移到sql server 2000的過程中並沒有遭遇太棘手的問題。當然,一開始我就深知系統之間肯定存在顯著的差異。我希望本文列出的差別有助於你避免一些常見的問題。我在清單a

將使用Access的論壇遷移到SqLServer中

我利用動網提供的論壇程式建立了乙個內部論壇。原來,這個論壇是發布在windows2000的iis5上的。他的資料庫用的是access。可是,當我將這個論壇遷移到windows2003上以後,發現經常死掉。到網上找了一下,並且諮詢了微軟的工程師,很多人都認為i這跟他使用access有關。並且,我想在公...

從Oracle遷移到SQL Server的陷阱

在把oracle查詢轉換為sql server的時候要特別當心一些不容易注意到的問題。我們知道,t sql是sql server的語言引擎,而oracle的語言引擎卻是plsql。這兩種查詢語言都對ansi sql 92標準進行了擴充套件以提供額外的支援力度。你所建立的應用程式幾乎都要用到這些補充特...

從 ADT 遷移到 Android Studio

如果你看到上面的優點,已經克服了心中的懷疑和恐懼,準備動手遷移,下面提供一些遷移提示。部分需要科學上網 你無法科學上網?趕緊搜一下,自己搭或者買乙個吧。世界如此多嬌,人生苦短。將你遇到過問題的出錯資訊用 google 搜尋,第一條來自 stackoverflow 的答案就是你想要的。android ...