我们老大让我替换所有表数据中各列上的"广州" 为"天津"这是我写的查找用户表中特定类型列上匹配列并构造update的语句 
DECLARE @fieldtype sysname
SET @fieldtype='nvarchar' SELECT N'update '+QUOTENAME(o.name)
    +N' set  '+ QUOTENAME(c.name) + N' = replace(' + QUOTENAME(c.name) + ',''广州'',''天津'')'
FROM sysobjects o,syscolumns c,systypes t
WHERE o.id=c.id 
    AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
    AND c.xusertype=t.xusertype
    AND t.name=@fieldtype
    AND o.name not like 'OldData_%'   --OldData_开头的表是备份数据,不要一起更新
ORDER BY o.name执行后的结果像这样update [BossECAddressOrg] set  [ECCode] = replace([ECCode],'广州','天津')
update [BossECAddressOrg] set  [PathCode] = replace([PathCode],'广州','天津')
update [BossECAddressOrg] set  [OrgCode] = replace([OrgCode],'广州','天津')
然后再执行这些结果就能更新了现在的问题是,现在只按照字段类型找出来了列,可实际上有的列虽然是nvarchar类型,可实际存储的数据里有可能根本不含有要替换的值"广州", 所以需要再进一步对用户数据进行判断, 不含"广州的列"就不需要用来构造update语句了请问怎么在上面代码基础上只查所有用户表里字段类型为nvarchar,并且实际存储数据里含"广州"字符串的表列, 并且按一个表构造一句update语句的形式(因为效率问题)来构造update呢?像下面这样:
update [BossECAddressOrg] set  [PathCode] = replace([PathCode],'广州','天津')
                              ,[OrgCode] = replace([OrgCode],'广州','天津')
因为表[BossECAddressOrg]里只有 [PathCode]和,[OrgCode]列的数据才含有"广州",所以,不需要用[ECCode] 来构造update语句,也就是说只更新真正需要更新的列, 然后最好能够分批执行这些update语句还有个问题,现在我暂时取消了这157个表之间的外键集联关系,才能执行更新,如果保持参照关系的话在构造生成update语句的时候就必须有顺序,怎么找出表间的集联关系并利用呢 ? 现在生成的简单upate都能执行,可执行起来太慢了,有的表的数据是十几万条,基本上就不能一次执行完,我试了一下,就是等半个小时也没能够执行完,而且我机器的内存还是2G的

解决方案 »

  1.   

    表[BossECAddressOrg]里只有   [PathCode]和,[OrgCode]列的数据才含有"广州",所以,不需要用[ECCode]   来构造update语句--------------
    这个恐怕只能由人来判断,然后手工修改生成的Update语句了,,,
      

  2.   


    DECLARE   @fieldtype   sysname 
    SET   @fieldtype='nvarchar'   SELECT   N'update '+QUOTENAME(o.name) 
            +N' set '+QUOTENAME(c.name)+N' = replace('  +  QUOTENAME(c.name) + ',''广州'',''天津'')' 
    +N' where '+QUOTENAME(c.name)+N' like ''%广州%'''
    FROM   sysobjects   o,syscolumns   c,systypes   t 
    WHERE   o.id=c.id   
            AND   OBJECTPROPERTY(o.id,N'IsUserTable')=1 
            AND   c.xusertype=t.xusertype 
            AND   t.name=@fieldtype 
            AND   o.name   not   like   'OldData_%'       --OldData_开头的表是备份数据,不要一起更新 
    ORDER   BY   o.name 
      

  3.   

    建议你构造语句改一下:
    DECLARE   @fieldtype   sysname 
    SET   @fieldtype='nvarchar'   SELECT   N'update '+QUOTENAME(o.name) 
            +N' set '+   QUOTENAME(c.name)   +   N'=replace(' + QUOTENAME(c.name) + ',''广州'',''天津'') WHERE ' 
    +   QUOTENAME(c.name)   + ' LIKE ''%广州%'' '
    FROM   sysobjects   o,syscolumns   c,systypes   t 
    WHERE   o.id=c.id   
            AND   OBJECTPROPERTY(o.id,N'IsUserTable')=1 
            AND   c.xusertype=t.xusertype 
            AND   t.name=@fieldtype 
            AND   o.name   not   like   'OldData_%'       --OldData_开头的表是备份数据,不要一起更新 
    ORDER   BY   o.name 这样生成的语句就是:update   [BossECAddressOrg]   set     [ECCode]   =   replace([ECCode],'广州','天津') WHERE [ECCode] LIKE '%广州%'
    update   [BossECAddressOrg]   set     [PathCode]   =   replace([PathCode],'广州','天津') WHERE [PathCode] LIKE '%广州%'
    update   [BossECAddressOrg]   set     [OrgCode]   =   replace([OrgCode],'广州','天津') WHERE [OrgCode] LIKE '%广州%'
      

  4.   

    楼上执行的结果:
    update [BossECAddressOrg] set [ECCode] = replace([ECCode],'广州','天津') where [ECCode] like '%广州%'
    update [BossECAddressOrg] set [PathCode] = replace([PathCode],'广州','天津') where [PathCode] like '%广州%'
    update [BossECAddressOrg] set [OrgCode] = replace([OrgCode],'广州','天津') where [OrgCode] like '%广州%'
      

  5.   

    要不海兄砍个脚掌回去? 附送原味袜子一只,HOHO~!~!
      

  6.   

    先谢谢大家但是都还不对啊,我不是要生成 
    update [BossECAddressOrg] set [ECCode] = replace([ECCode],'广州','天津') where [ECCode] like '%广州%'
    update [BossECAddressOrg] set [PathCode] = replace([PathCode],'广州','天津') where [PathCode] like '%广州%'
    update [BossECAddressOrg] set [OrgCode] = replace([OrgCode],'广州','天津') where [OrgCode] like '%广州%'而是要生成
    update   [BossECAddressOrg]   set     [PathCode]   =   replace([PathCode],'广州','天津') 
                                         ,[OrgCode]   =   replace([OrgCode],'广州','天津') 并执行注意,下面的比上面的少了一列[ECCode] ,而且是一个表一个update,不是一个列一个
      

  7.   

    如果表里的数据行很大的话,按列生成update是不好用的,而且条件还是像like '%广州%' 的全表扫描
      

  8.   

    全表扫描也比你的每条记录都replace好吧?
      

  9.   


    update [BossECAddressOrg] set [ECCode] = replace([ECCode],'广州','天津') where [ECCode] like '%广州%'
    update [BossECAddressOrg] set [PathCode] = replace([PathCode],'广州','天津') where [PathCode] like '%广州%'
    update [BossECAddressOrg] set [OrgCode] = replace([OrgCode],'广州','天津') where [OrgCode] like '%广州%'
    上面第一句更新是多余的,怎么去掉?
      

  10.   

    不知道能不能乘机砍个熊掌回家尝尝鲜?!.........       -----------   
    这个嘛,熊掌给你煮汤喝是没什么问题,可是偶以后拿什么挖鼻孔捏? -------------------------- 
    熊够N!
    --------------------------
    CSDN应该设个幽默贴子专区,好的贴子转进去,娱乐娱乐