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
  • 相关阅读:
    node搭建文件服务器
    es6快速排序
    vue+koa+mysql简易demo
    linux常用命令
    su: Authentication failure 的解决方案
    安装gensim报错:Original error was: DLL load failed: 找不到指定的模块。 Command "python setup.py egg_info" failed with error code 1 in C:UsersxubingAppDataLocalTemppip-install-nta89iepgensim
    使用服务器上的Jupyter notebook。
    tf.nn.conv2d()需要搞清楚的几个变量。
    tf入门-池化函数 tf.nn.max_pool 的介绍
    tf入门-卷积步长strides参数的具体解释
  • 原文地址:https://www.cnblogs.com/Impulse/p/1256191.html
Copyright © 2011-2022 走看看