更新数据库所有表的某一个指定字段 ,附加对‘将 varchar 值转换为数据类型为 int 的列时发生语法错误’处理方法

在某些情况下,需要更新数据库所有具有某一个特定字段的表,例如:把集团公司某个系统中本来属于A子公司的数据全部更新为属于B子公司的,如果手工一个表一个表进行更改,首先浪费时间,机械化重复,另外,如果对系统数据库结构不熟悉,还要一个一个表查找、检查是否有该字段,其实蛮麻烦的。
最近刚好我有这样的需求,于是,做了一个通用的存储过程来解决这样的问题。

该存储过程用到的数据库基本知识点有:
1 如何查找数据库中所有的表
2 如何查找表的所有字段
3 如何执行字符串连接起来的SQL语句(执行动态SQL语句)
4 执行动态SQL语句并返回值
5 动态游标

create procedure sp_fix_update_tables_appoint_column
 @column_name nvarchar(100), -- 制定需要更新的字段名
 @value_to_reaplace varchar(255), -- 如果是某值得情况下才更新
 @value_new varchar(255), -- 新的赋值
 @table_not_inclue varchar(255) -- 排除在外的不进行更新的表 (某些情况下,特定的表可能不需要更新)
as
if ltrim(rtrim(@table_not_inclue))=''
 set @table_not_inclue=''''''
else
 set @table_not_inclue='''' + replace(@table_not_inclue,',',''',''') + ''''

declare @table_name as nvarchar(255)
declare @sql_cur as varchar(2000)
 set @sql_cur='declare cur_tables cursor for
  select name from sysobjects where xtype=''U'' and name not in (' + @table_not_inclue + ')'
exec (@sql_cur)
open cur_tables
fetch next from cur_tables into @table_name
while @@fetch_status=0
begin

 declare @column_count as int
 declare @sql_find_column as nvarchar(1000)
 set @sql_find_column=N'SELECT @column_count=count(dbo.syscolumns.name)
  FROM dbo.syscolumns INNER JOIN
  dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id
  WHERE dbo.sysobjects.name=''' + @table_name + ''''
  + ' and  dbo.syscolumns.name =''' + @column_name + ''''
  + ' and (dbo.sysobjects.xtype = ''u'') AND (NOT (dbo.sysobjects.name LIKE ''dtproperties''))'
 
 exec sp_executesql @sql_find_column,N'@table_name varchar(233),@column_name varchar(100),@column_count int output'
  ,@table_name,@column_name,@column_count output
 
 if(@column_count=1)
 begin
  print @table_name
  declare @sql_update as varchar(1000)
  set @sql_update='update ' + @table_name + ' set ' + @column_name + '=''' + @value_new + ''' where '
   + @column_name + '=''' + @value_to_reaplace + ''''
  exec (@sql_update)
 end
 fetch next from cur_tables into @table_name
end
close cur_tables
deallocate cur_tables

 

就是如果参数为整形的时候,在使用参数得时候的通过case将类型转化为varchar,不然就会报将 varchar 值转换为数据类型为 int 的列时发生语法错误

 set @sql_update='update ' + @table_name + ' set ' + @column_name + '=''' + case(@value_new as varchar)+ ''' where '
   + @column_name + '=''' + case(@value_to_reaplace as varchar) + ''''

posted @ 2008-07-30 10:21  凡的世界  阅读(2726)  评论(0编辑  收藏  举报