我们老大让我替换所有表数据中各列上的"广州" 为"天津"这是我写的查找用户表中特定类型列上匹配列并构造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的
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的
这个恐怕只能由人来判断,然后手工修改生成的Update语句了,,,
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
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 '%广州%'
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 [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,不是一个列一个
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 '%广州%'
上面第一句更新是多余的,怎么去掉?
这个嘛,熊掌给你煮汤喝是没什么问题,可是偶以后拿什么挖鼻孔捏? --------------------------
熊够N!
--------------------------
CSDN应该设个幽默贴子专区,好的贴子转进去,娱乐娱乐