12
返回列表 发新帖
楼主: wangxt

一个很头痛的问题,敬请各位牛人进行看看怎么解决

[复制链接]
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
11#
发表于 2004-6-29 22:13 | 只看该作者
从功能上看, C为地址提供了一简化了的名称, 在做成B表的时候, 需要根据地址找出简称, 而A表的作用偶还看不到, 从数据上看A表只是B表的一部分, 以A表为中心处理自然非常麻烦. 既然中心是B表, 不如直接修改B表, 用地址找出简称然后在插入和更新B表, 如果有必要留下A表的话, 同时去修改A表, 或者干脆不要A表或者把A变成B的视图, 应该是效率最高的做法.
当然, 偶并不知道你的处理业务, 所提意见仅供参考

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2004-7-3 20:35 | 只看该作者

版主老大,我找到一个更好的解决方案

你的方法我在B表的20000 C表400条记录中轮巡一遍得花费好几个小时,下面这个方法我只用了5分钟,你看看,主要是用了CHARINDEX()这个函数

CREATE proc shujuzhuanhuan
as
set xact_abort on
begin tran
        --首先处理A表地址更新过的B表记录
        update B set baddress=a.aaddress
        from B join A on a.ano=b.bno
        where a.aaddress<>b.baddress

        --将A表新增的记录插入到B表中
        insert B(bno,bname,baddress,bbuilding)
        select ano,aname,aaddress,''
        from A
        where not exists(
                select 1 from B where bno=a.ano)

        --更新 B表 bbuilding 字段
        update B set bbuilding=c.building
        from B
                join C on charindex(RTRIM(c.building),b.baddress)>0
commit tran
GO

使用道具 举报

回复
论坛徽章:
37
授权会员
日期:2005-10-30 17:05:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:42:47管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
13#
发表于 2004-7-3 23:14 | 只看该作者
好,我研究研究看看,我那个方法是不太好,我没做优化

使用道具 举报

回复
论坛徽章:
5
2008新春纪念徽章
日期:2008-02-13 12:43:03奥运会纪念徽章:艺术体操
日期:2008-05-25 08:33:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:04:59
14#
发表于 2004-7-4 09:03 | 只看该作者

最好的办法是用触发器

还是用触发器吧, 这样你就不用费太多心思在修改数据时调用存储过程。用触发器很简单,不会我教你。
1、为A表增建一个update触发器,这触发器的触发条件是发生在A表的address列上
触发器内容为:
   if updated(address)
      update b  set  building=a.address+'和'+c.building  
               from  inserted as a  inner join c
               on  charindex(RTRIM(c.building),a.baddress)>0
               where  bno=a.ano
2、至于insert触发器要更简单,调不通再与我联系。

使用道具 举报

回复
论坛徽章:
0
15#
 楼主| 发表于 2004-7-5 08:43 | 只看该作者

TO:mina1

原问题是牵涉两个数据库,原数据库我只有查询的权限,不能修改,所以我只能先调用一个存储过程从原数据库中批量调出所需的数据插入当前数据库的A表中,由于是批量插入,所以触发器不是很好用(我测试过),这种情况下只能用存储过程

使用道具 举报

回复
论坛徽章:
5
2008新春纪念徽章
日期:2008-02-13 12:43:03奥运会纪念徽章:艺术体操
日期:2008-05-25 08:33:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:04:59
16#
发表于 2004-7-5 20:41 | 只看该作者

那么就用存储过程+触发器

新建一个存储过程进行批量插入操作,在向A表批量插入时顺便向B表也插入这样数据,然后为A表创建update式触发器。试试看

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
17#
发表于 2004-7-5 23:28 | 只看该作者
触发器的缺点是无法进行事务管理, 因此并不适合用于解决数据一致性的问题.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表