更新数据库所有表的某一个指定字段 ,附加对‘将 varchar 值转换为数据类型为 int 的列时发生语法错误’处理方法
最近刚好我有这样的需求,于是,做了一个通用的存储过程来解决这样的问题。
该存储过程用到的数据库基本知识点有:
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) + ''''