zoukankan      html  css  js  c++  java
  • 自动生成数据同步存储过程的存储过程

    最近几天都在搞数据库,特别是今天,因为需要,自己写了一个自动生成同步数据存储过程的存储过程。。。废话不多少,直接上代码:

     --开始
     --create proc exec_copy
     --as 
     --begin
     --因为同步的表是内网表,基本不做业务逻辑处理,所以所有的表都没有标示列,故我也就没做标示列的处理
     set nocount on
        declare @tab_count int --存放用户表的数量
        declare @col_count int --存放某个表中列的数量
        declare @str_sql varchar(max)--存放动态生成的T-SQL语句
        set @tab_count=(select count(object_id) from sys.objects where type_desc='USER_TABLE')--查询当前数据库中用户表的数量
        --print @tab_count
        declare @jishu_tab int
        set @jishu_tab=1
        declare @object_id int--存放某个表的object_id
        while (@jishu_tab<=@tab_count)--循环数据库中的所有用户表
        begin
            set @object_id=(select top 1 object_id from sys.objects where type_desc='USER_TABLE' and name='表名')--根据指定表名,如果要同步一个数据库
          --可以注释掉name=''把下面的取消注释
    --object_id not in(select top(@jishu_tab-1) object_id from sys.objects where type_desc='USER_TABLE'))--查询第@jishu个表的object_id declare @tab_name varchar(50); set @tab_name=(select name from sys.objects where object_id=@object_id)--根据查询出的object_id查询表名 declare @schema varchar(50)--存放表架构 set @schema=(select b.name from sys.objects a left join sys.schemas b on a.schema_id=b.schema_id where a.name=@tab_name)--根据表明查询表的架构 set @str_sql='create proc '+@tab_name+'_pro as begin /*set identity_insert dataName.'+@tab_name+' on*/ delete dataName.'+@tab_name+' where ' declare @pk_col varchar(50)--存放主键列名 --创建一个游标 declare cur_my cursor scroll for select d.name from sys.objects as a left join sys.indexes as b on a.object_id=b.object_id and b.is_primary_key=1 left join sys.sysindexkeys as c on b.index_id=c.indid and c.id=a.object_id left join sys.syscolumns as d on c.colid=d.colid and d.id=a.object_id where a.name=@tab_name open cur_my--打开游标 fetch first from cur_my into @pk_col --print @str_sql set @str_sql=@str_sql+@pk_col+' in(select '+@pk_col+' from '+@schema+'.'+@tab_name+')' while(@@fetch_status=0) begin fetch next from cur_my into @pk_col if(@@fetch_status=0) begin set @str_sql=@str_sql+' and '+@pk_col+' in(select '+@pk_col+' from '+@schema+'.'+@tab_name+')' end end --print @str_sql close cur_my--关闭游标 deallocate cur_my--删除创建的游标 set @col_count=(select count(name) from sys.syscolumns where id=@object_id) declare @jishu_col int set @jishu_col=1 declare @all_name varchar(max) while(@jishu_col<=@col_count) begin declare @col_name varchar(50)--存放查询出的列名 set @col_name=(select top 1 name from sys.syscolumns where id=@object_id and name not in ( select top (@jishu_col-1) name from sys.syscolumns where id=@object_id)) if(@jishu_col=1) begin --set @str_sql=@str_sql+@col_name+' in(select '+@col_name+' from '+@tab_name+')' set @all_name=@col_name+',' set @str_sql=@str_sql+' insert into dataName.'+@tab_name+'(cols)'+' select cols from '+@schema+'.'+@tab_name end if(@jishu_col=@col_count) begin set @all_name=@all_name+@col_name end else if(@jishu_col!=1) set @all_name=@all_name+@col_name+',' set @jishu_col=@jishu_col+1 --自增 end set @str_sql=@str_sql+'/* set identity_insert dataName.'+@tab_name+' off*/ end' set @str_sql=replace(@str_sql,'cols',@all_name) set @str_sql=replace(@str_sql,'dataName','shenpan_text.'+@schema) print @str_sql set @jishu_tab=@jishu_tab+1--自增 break end set nocount off --end --结束

    感觉还有很多缺点,望各位博友多多指教。

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/caoxianbing/p/3739496.html
Copyright © 2011-2022 走看看