zoukankan      html  css  js  c++  java
  • 更新数据库所有表的某一个指定字段 ,附加对‘将 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) + ''''

    微软BI技术交流群:316744959 武汉NET技术群:961108969 NET技术群:21386099 本人具有丰富的系统开发经验,承接系统开发,小程序,NET系统开发,BI开发,有需求联系微信手机:15010195887
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/Impulse/p/1256191.html
Copyright © 2011-2022 走看看