文章詳情頁(yè)
教你怎樣把Oracle查詢(xún)轉(zhuǎn)換為SQL Server
瀏覽:4日期:2023-11-26 10:31:41
在把Oracle查詢(xún)轉(zhuǎn)換為SQL Server的時(shí)候要非凡當(dāng)心一些不輕易注重到的問(wèn)題。我們知道,T-SQL是SQL Server的語(yǔ)言引擎,而Oracle的語(yǔ)言引擎卻是PLSQL。這兩種查詢(xún)語(yǔ)言都對(duì)ANSI SQL-92標(biāo)準(zhǔn)進(jìn)行了擴(kuò)展以提供額外的支持力度。你所創(chuàng)建的應(yīng)用程序幾乎都要用到這些補(bǔ)充特性。本文就對(duì)最常用的、非標(biāo)準(zhǔn)的Oracle擴(kuò)展進(jìn)行了說(shuō)明,同時(shí)還要介紹下如何對(duì)這些擴(kuò)展進(jìn)行轉(zhuǎn)化以用在SQL Server環(huán)境下。列的選擇用PLSQL執(zhí)行數(shù)據(jù)查詢(xún)的時(shí)候,F(xiàn)ROM子句是必須的,這同SQL Server的要求是一樣的。 SELECT語(yǔ)句必須選擇針對(duì)的數(shù)據(jù)表。在Oracle數(shù)據(jù)庫(kù)內(nèi)有一種非凡的表DUAL。DUAL表由Oracle連同數(shù)據(jù)字典一同創(chuàng)建,所有的用戶(hù)都可以用名稱(chēng)DUAL訪(fǎng)問(wèn)該表。這個(gè)表里只有一列DUMMY,該列定義為VARCHAR2(1)類(lèi)型,有一行值X。從DUAL表選擇數(shù)據(jù)常被用來(lái)通過(guò)SELECT語(yǔ)句計(jì)算常數(shù)表達(dá)式,由于DUAL只有一行數(shù)據(jù),所以常數(shù)只返回一次。Oracle下的DUAL查詢(xún)?nèi)缦滤荆篠ELECT; ‘x’ FROM dual而對(duì)等的SQL Server查詢(xún)則是下面這個(gè)樣子:SELECT ‘x’連接Oracle用 符號(hào)作為連接符,而SQL Server的連接符是加號(hào):+ 。Oracle查詢(xún)?nèi)缦滤荆篠elect ‘Name’ ‘Last Name’From tableName對(duì)應(yīng)的SQL Server查詢(xún)?nèi)缦滤荆篠elect ‘Name’ + ‘Last Name’數(shù)字取舍Oracle數(shù)據(jù)庫(kù)內(nèi)有一個(gè)TRUNC函數(shù),該函數(shù)返回m位十進(jìn)制數(shù)的n位;假如省略m則n就是0位。m的值可以為負(fù),表示截去小數(shù)點(diǎn)左邊m位數(shù)字。在SQL Server下可以用Round或者Floor。以下是Oracle查詢(xún):SELECT; TRUNC(15.79,1) 'Truncate' FROM DUAL;下面是同類(lèi)查詢(xún)的SQL Server版本:SELECT ROUND(15.79, 0) rounded , ROUND(15.79, 0,1) truncatedSELECT FLOOR(ROUND(15.79, 0)),FLOOR(ROUND(15.79, 0,1) )數(shù)字轉(zhuǎn)換Oracle的TO_CHAR函數(shù)可以把n位NUMBER數(shù)據(jù)類(lèi)型轉(zhuǎn)換為VARCHAR2 數(shù)據(jù)類(lèi)型,同時(shí)采用可選的數(shù)字格式。SQL Server則通過(guò)STR函數(shù)返回?cái)?shù)字轉(zhuǎn)換之后的字符數(shù)據(jù)。不過(guò),該函數(shù)不具方便的Format參數(shù)。Oracle查詢(xún)?nèi)缦拢?lt;CENTER><ccid_nobr><table border='1' cellspacing='0' cellpadding='2' bordercolorlight = 'black' bordercolordark = '#FFFFFF' align='center'><tr> <td bgcolor='e6e6e6' style='font-size:9pt'> <pre><ccid_code>SELECT to_char(123.45 ,99999999999999) from tabSELECT to_char(EXPIRY_DATE,'DDMONYYYY') from tab以下是SQL Server版本的查詢(xún):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的查詢(xún):SELECT LENGTH('SQLMAG') 'Length in characters' FROM DUAL;以上查詢(xún)?cè)赟QL Server下是這樣寫(xiě)的:SELECT LEN('SQLMAG') 'Length in characters'日期Oracle取得日期和采用如下方式:SYSDATESQL Server則是這樣的:GETDATE()你可以用各種語(yǔ)法操作日期。以下的代碼對(duì)Oracle日期值中的月份進(jìn)行了格式調(diào)整(返回日期再加上n月):Selectadd_months(sysdate,12) from dualSQL Server則是如下完成同等功能的:Select dateadd(mm,12,getdate())數(shù)據(jù)的減法也不同。以下代碼在Oracle中直接對(duì)數(shù)據(jù)進(jìn)行減法操作:SELECT sysdate -add_months(sysdate,12) FROM dualSQL Server則是這樣做的:SELECT; datediff(dd, GetDate(),dateadd(mm,12,getdate()))小結(jié)幸而,我在從Oracle遷移到SQL Server 2000的過(guò)程中并沒(méi)有遭遇太棘手的問(wèn)題。 當(dāng)然,一開(kāi)始我就深知系統(tǒng)之間肯定存在顯著的差異。我希望本文列出的差別有助于你避免一些常見(jiàn)的問(wèn)題。我在清單A中列出了一個(gè)示例,大家可以參考一下。
標(biāo)簽:
Oracle
數(shù)據(jù)庫(kù)
排行榜
