MSSQL資料庫轉到FIREBIRD資料庫的問題

2021-09-05 20:42:39 字數 2620 閱讀 4421

我是fb新手,在我的原mssql**中,存在依賴於區域性臨時表(注意是區域性而不是全域性)的操作,現在轉到fb了怎麼辦?而且,為效能計,我還用到了mssql裡面的表變數型別(從mssql的自定義函式裡返回表變數),這可怎麼辦啊?大家給我出出主意!

另外,在mssql裡面的語句:

1)select * into tmptable from atable

(複製atable表中的資料到tmptable表)

2)update atable set afield=b.bfield from atable a,btable b where a.id=b.id

(根據btable中的資料更新atable中的資料)

3)insert atable select * from btable

(將btable中的資料追加到atable中,atable與btable結構一致)

這些語句改寫成fb(或等價物)應該怎麼做?如果能搞定這幾個問題,則我的遷移工作將會極為順利,高手幫幫我啊!!!謝謝!!

lmf:

區域性臨時表,可以考慮用全域性臨時表或derivative table,不過派生表有的時候效率不夠。表變數有點不太明白,有可能通過execute statament解決。

1.要先建tmptable的表結構。當然為了方便,可以考慮自己編寫udf函式或儲存過程,這樣可以盡量保持和原來使用一樣

2.可以使用以下語句代替:

update atable set afield=(select bfield from btable where btable.id=atable.id)

where exists (select bfield from btable where btable.id=atable.id)

3.如果atable和btable的結構完全一致,保持字段個數和順序,則不需要改變

huangpin:

derivative table 有些什麼性質?在mssql裡,表變數就是型別為表的變數,可以跟普通表一樣進行各種操作.可以理解為在記憶體中的一張表,當超出作用域範圍後自動銷毀.

對於update atable set afield=(select bfield from btable where btable.id=atable.id)

where exists (select bfield from btable where btable.id=atable.id)能否寫成如下更簡潔的形式?:

update atable set afield=(select bfield from btable where btable.id=atable.id) 不要後面的where子句了,按理來說也應該行得通啊,因為此語句裡本身就包含了足夠的條件.

多謝各位的關注!

lmf:

對於update atable set afield=(select bfield from btable where btable.id=atable.id)

where exists (select bfield from btable where btable.id=atable.id)

估計根據sql92標準,需要where子句。如果不需要,則對於在btable中找不到的記錄會在atable中填null值

firebird 對於臨時表不大支援。如果原來用了大量的臨時表,可能需要作不少改動了。我提到全域性臨時表,和派生表,是覺得用這兩種方法基本上能解決臨時表的問題。臨時表可以用到最少。我自己就幾乎不用臨時表,只不過有的時候用臨時錶比不用要提高效率。派生表指的是這種形式:select ... from (select... from...)。括號裡的指的就是派生表。除了用派生表,在fb2.1中還可以用cte,基本上也能夠起到臨時表作用。

我現在基本上不用或少用儲存過程,用這些手段應該差不多夠了。有可能有極少數地方還是需要用臨時表來做優化,那就採用全域性臨時表算了。

huangpin:

你這麼說,我大致明白派生表是什麼東西了,但是,顯然有乙個問題是"派生表"所無法解決的,派生表裡的資料無法保持和更改.它看起來只能把資料讀取出來!!

lmf:

你的有關臨時表的問題估計要費不少心血了。全域性臨時表應該有可能解決你一部分問題。

neumann:

全都可以實現,而且不很難。

1)select * into tmptable from atable

(複製atable表中的資料到tmptable表)

insert into tmptable select * from atable

2)update atable set afield=b.bfield from atable a,btable b where a.id=b.id

(根據btable中的資料更新atable中的資料)

update atable set afield =

(select b.bfield from btable b

where exists (select a.* from atable a where a.id = b.id))

3)insert atable select * from btable

(將btable中的資料追加到atable中,atable與btable結構一致)

lmf:

to neumann:

對於1,如果tmptable不存在,還是需要根據atable來自己預先建立的

MSSQL資料庫注入

用下面的這種方法暫時解決了,目前為止沒有再出現插入了 在global.asax檔案下面加入如下 希望能管用.針對.net region sql注入式攻擊 分析 處理使用者提交的請求 分析使用者請求是否正常 傳入使用者提交資料 返回是否含有sql注入式攻擊 private bool processsq...

MSSQL資料庫使用者

1 建立登入帳戶 1 新增 windows 登入帳戶 exec sp grantlogin jbtraining s26301 網域名稱 使用者名稱 2 新增 sql 登入帳戶 exec sp addlogin zhangsan 1234 exec 表示呼叫儲存過程,儲存過程類似 c 語言的函式。內...

MSSQL資料庫同步

mssql資料同步利用資料庫複製技術實現資料同步更新 來自網路,也是非常完美的教程 複製的概念 複製是將一組資料從乙個資料來源拷貝到多個資料來源的技術,是將乙份資料發布到多個儲存站點上的有效方式。使用複製技術,使用者可以將乙份資料發布到多台伺服器 上,從而使不同的伺服器使用者都可以在許可權的許可的範...