sqlserver指令碼轉oracle常見問題注意

2021-09-12 16:14:13 字數 1365 閱讀 5056

由於目前主要工作在**,**專案使用的資料庫為oracle資料庫,在平時**改造和資料庫操作時會有很多sql語句的編寫,發現了幾點小問題與大家分享一下。

1、!="哈哈"

經常看到sqlserver中的sql語句這樣寫,但是oracle資料庫中會導致你這個查詢語句會找不到所有此字段為null的值。需要注意的就是 oracle 中的 null 不能用 =及!=用來比較 ,只能使用is null 或者 is not null,

當字段中有null時,需要區別對待。

說明:1、等價於沒有任何值、是未知數。

2、null與0、空字串、空格都不同。

3、對空值做加、減、乘、除等運算操作,結果仍為空。

4、null的處理使用nvl函式。

5、比較時使用關鍵字用「is null」和「is not null」。

6、空值不能被索引,所以查詢時有些符合條件的資料可能查不出來,count(*)中,用nvl(列名,0)處理後再查。

7、排序時比其他資料都大(索引預設是降序排列,小→大),所以null值總是排在最後。

所以基本上使用這種判斷的時候,最好使用nvl函式去做乙個轉換,然後判斷。

2、ntext

對於型別ntext的字段,在資料庫插入語句時,sqlserver常常使用db.string型別,有時候遷移**,也會發現oracle版本的寫法也是這樣寫,但是這樣的寫法會有問題的。

例如attrinfo欄位為ntext型別,

db.addinparameter(cmd, "attrinfo", dbtype.string, userarea.attrinfo);

這種寫法在sqlserver資料庫不會出現問題,但是oracle資料庫的話會出現異常,我這邊從網上找到的寫法為:

oracleparameter op1 = new oracleparameter("attrinfo", oracletype.nclob);//申請材料

if (!string.isnullorempty(userarea.attrinfo))

else

cmd.parameters.add(op1);

3、其他

有時候指令碼從mis平台匯出,執行時會出現異常,發現異常基本上有如下幾點:

1、索引、觸發器、表名過長

這個也僅僅是出現在老版本的oracle資料庫,目前最新的資料庫應該已經修復,這些名稱應該需要名稱字段小於30長度

2、特殊名稱

例如有個時間字段起名date

執行指令碼:

alter table sqb_fdcjjjgjqfzjg add date date  null會出現異常

正確寫法:

alter table sqb_fdcjjjgjqfzjg add "date" date  null

ora 8103 解決指令碼

自己寫的處理ora 8103 錯誤的指令碼,物件實際已經刪除了,但相關資訊還是保留在資料字典了,需要修改資料字典,最後是alter system flush shared pool 因為資料字典環快取是放在共享池裡的。create or replace procedure del dictionar...

SQLSERVER備份指令碼

看網上的例子寫的sqlserver資料庫備份指令碼,這個指令碼不是很好,不能刪除以前備份的。declare currentdatabasename nvarchar 100 declare currentbackfolder nvarchar 200 declare weekday varchar ...

常用指令碼範例(SQL Server)

增加關聯 新增表tablea與表tableb的關係 if not exists select from sysobjects where id object id fk tablea tableb begin alter table dbo tablea add constraint fk tabl...