首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册
数据库 :: 数据库

MSSQL数据库转到Firebird数据库的问题


http://www.gipsky.com/
huangpin:

我是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来自己预先创建的
<< 一个关于firebird数据库的sql查询方法 firebird数据库介绍 >>
评分
10987654321
API:
gipsky.com& 安信网络
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。

系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号