zoukankan      html  css  js  c++  java
  • MSSQL数据库转到FIREBIRD数据库的问题

    我是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来自己预先创建的
  • 相关阅读:
    iscroll在iphone浏览器上闪动的BUG
    Emmet (ZenCoding) 缩写语法
    jqmobi快速开始(翻译)
    前端资源站点
    DOM Storage全解析
    html5离线应用
    XML的浏览器解析方案,正在尝试 。
    用 JavaScript来判断浏览器的种类
    delphi7判断字符串的组成
    没想到手机发邮件要占用那么大的空间
  • 原文地址:https://www.cnblogs.com/top5/p/1433020.html
Copyright © 2011-2022 走看看