SQL server学习——两表对照

自己闲来无事的时候就写了一个存储过程,用来对比两张表的相同性。
1、这个存储过程主要是用来查看数据量大的前提下,在不知道删除了什么数据,想要恢复.
2、这个存储过程不考虑表中的数据是否有唯一id,没有id一样行的通
3、表中的列一般情况下不能少于两列,少于两列的没有测试可用性
4、那个恢复数据功能有一个小问题,还没解决掉

/**
*对比两张表的不同
*
**/
alter proc sys_tableVsfit@tables_former varchar(1000),--原数据表@tables_Delete varchar(1000),--删除数据表@tables_Restore varchar(1000)='0' --默认不还原
as
begin--去两边的空格set @tables_former=ltrim(rtrim(@tables_former))set @tables_Delete=ltrim(rtrim(@tables_Delete))declare @table_nameFormer varchar(1000),--建立所用到的变量@table_nameDelete varchar(1000),@name varchar(1000),@num varchar(1000),@tb varchar(1000),@addtb varchar(1000),@tb_Formerid int,@table_Deleteid int,@tb_FormerCount int,@indexNo varchar(1000),@table_DeleteCount int,@Formerlie varchar(1000)='',@Deletelie varchar(1000)=''--过渡表create table #tb_Former(varid int primary key identity(1,1)
)   --真实数据表create table #tb_FormerReal(varid int primary key identity(1,1)
)   --删除表idcreate table #tb_Delete(varid int primary key identity(1,1)
)--删除的数据create table #tb_DeleteReal(varid int primary key
)--查询表中是否有传过来的表名select @table_nameFormer=name,@tb_Formerid=id from sysobjects where name=@tables_formerselect @table_nameDelete=name,@table_Deleteid=id from sysobjects where name=@tables_Delete--根据表名id查询列名,是否数目相同select @tb_FormerCount=count(name) from syscolumns where id=@tb_Formerid select @table_DeleteCount=count(name) from syscolumns where id=@table_Deleteidif isnull(@table_nameFormer,null)=nullbeginprint '输入的原数据表名为空'returnendif isnull(@table_nameDelete,null)=nullbeginprint '输入的删除数据表名为空'returnendif @tb_FormerCount<>@table_DeleteCountbeginprint '两表不相同,请核对'returnend---添加原数据据列,查询真正数据列名declare sys_name cursorfor(select name from syscolumns  where  id=@tb_Formerid)open sys_name--循环下一行游标fetch next from sys_name into @namewhile @@FETCH_STATUS=0begin--向临时表中添加真是数据库列名set @addtb='alter table #tb_Former add ' +@name+ ' varchar(1000)'--print @addtbexec(@addtb)set @addtb='alter table #tb_DeleteReal add ' +@name+ ' varchar(1000)'--print @addtbexec(@addtb)--获取列名为后面进行比较set @Formerlie += @name--print @namefetch next from sys_name into @nameend--打印表1里面的列--print @formerlieclose sys_namedeallocate sys_name---查询删除数据列名declare sys_name2 cursorfor(select name from syscolumns  where  id=@table_Deleteid)open sys_name2--循环下一行游标fetch next from sys_name2 into @namewhile @@FETCH_STATUS=0begin--删除表数据、真实数据表 用作varid比较set @addtb='alter table #tb_Delete add ' +@name+ ' varchar(1000)'exec(@addtb)set @addtb='alter table #tb_FormerReal add ' +@name+ ' varchar(1000)'exec(@addtb)--同理获取列名用作比较set @Deletelie += @name--print @namefetch next from sys_name2 into @nameend--打印表2里面的列--print @Deletelieclose sys_name2deallocate sys_name2--把真实数据放到临时表里面set @addtb='insert #tb_FormerReal select * from '+ @table_nameFormerexec(@addtb)--判断列名是否相同,(不区分大小写,需求可以改),判断的是列名set @indexNo = isnull(nullif(@Formerlie,@Deletelie),'NO')if @indexNo<>'NO'beginprint '两表不相同,请核对'returnend--添加过度列,作用是为了左连接判断删除数据的空值nulldeclare @l1 varchar(1000),@l2 varchar(1000),@l3 varchar(1000),@l4 varchar(1000),@v1 nvarchar(1000)='',@v2 nvarchar(1000)='',@v3 nvarchar(1000)='',@v4 nvarchar(1000)='',@numl int,@numn varchar(1000)='1',@insersql nvarchar(1000)--设置一个计时器初始值为零set @numl=0declare sys_name1 cursorfor(select name from syscolumns  where  id=@tb_Formerid)open sys_name1--循环下一行游标fetch next from sys_name1 into @namewhile @@FETCH_STATUS=0beginset @addtb='alter table #tb_Former add ' +@name+ '1 varchar(1000)'--print @addtbexec(@addtb)--把列名提取出来if @numl=1beginif isnull(@name,'1')<>'1'beginset @l1 = @name+@numnset @v1 = @nameendelse set @l1='*'endelse if @numl=2beginif isnull(@name,'1')<>'1'beginset @l2 = @name+'1'set @v2 = @nameendelse set @l2='*'endelse if @numl=3beginif isnull(@name,'1')<>'1'beginset @l3 = @name+@numnset @v3 = @nameendelse set @l3='*'end--第一列一般都是id,但是考虑到没有id的情况,添加多个列名else if @numl=0beginif isnull(@name,'1')<>'1'beginset @l4 = @name+@numnset @v4 = @nameendelse set @l4='*'end--把计时器相加set @numl+=1fetch next from sys_name1 into @nameendclose sys_name1deallocate sys_name1--把两个表的值添加进去--insert into #tb_Former select * from staff st left join staff1 sf on st.id=sf.id--列名只有大于3列才有意义,小于3列一般都是id加值,所以直接确定id就可以了set @insersql='insert into #tb_Former select * from '+@table_nameFormer+' st left join '+@table_nameDelete+' sfon '+case when @tb_FormerCount>=3 then' st.'+@v4+'=sf.'+@v4+' and st.'+@v1 +'=sf.'+@v1+' and st.'+@v2+'=sf.'+@v2else ' st.'+@v4+'=sf.'+@v4 endexec(@insersql)--循环查询里面的数据declare @tb_count int, @n1 Nvarchar(1000),@n2 Nvarchar(1000),@n3 Nvarchar(1000),@n4 Nvarchar(1000),--设置默认没有被删除数据@sql Nvarchar(1000),@varid int,@index1 varchar(10)='false'--获取里面值的总数select @tb_count=count(varid) from #tb_Former--往删除表里添加删除的id,主要是为了把删除的那些值的varid存进去为以后连表查询做准备alter table #tb_Delete add Delete_id intwhile @tb_count >0begin--查询删除表的数据,为空赋值为'false'set @sql='select @varid=varid,'+case when @tb_FormerCount>=3 then '@n1=isnull(cast('+@l1+' as varchar),''false''),@n2=isnull(cast('+@l2+' as varchar),''false''),@n3=isnull(cast('+@l3+' as varchar),''false'')' else '@n1=isnull(cast('+@l4+' as varchar),''false''),@n2=isnull(cast('+@l1+' as varchar),''false'')' end +' from #tb_Former where varid=@tb_count'--这个执行过程是为了把变量里面的值拿出来exec sp_executesql @sql,N'@n1 varchar(1000) out,@n2 varchar(1000) out,@n3 varchar(1000) out,@varid int out,@tb_count int',@n1 out,@n2 out,@n3 out,@varid out,@tb_count--都等于false说明是删除的数据,前面的三个空值就可以判定它是删除数据了,--前面的三个值是空的,有几率 但是基本不可能,前面的数据一般都是有值的if (@n1='false'and @n2='false' and @n3='false')begin--把查出来删除的varid放到事先准备好的Delete_id里面insert into #tb_Delete(Delete_id)select varid from #tb_Former where varid=@varid--进来就说明里面有删除的数据set @index1='true'endset @tb_count -= 1end--查询被删除的值if @index1<>'true'beginprint '抱歉,你没有删除任何数据'endif @index1='true'begin--把删除的varid和真是数据varid关联查询出被删的数据,添加到删除数据的临时表中insert into #tb_DeleteRealselect * from #tb_FormerReal st where st.varid in(select sf.Delete_id from #tb_Delete sf)--查询被删的数据set @sql='select * from #tb_DeleteReal'exec(@sql)end--还原数据(bug)暂时不可用/*if @tables_Restore='1' or @tables_Restore like'%还原%'begin--打开标识列set @sql='SET IDENTITY_INSERT '+@table_nameDelete+' ON'exec(@sql)set @sql ='insert into '+ @table_nameDelete+' select * from #tb_FormerReal st where st.varid in(select sf.Delete_id from #tb_Delete sf)'exec(@sql)--关闭标识列set @sql='SET IDENTITY_INSERT '+@table_nameDelete+' OFF'exec(@sql)end*/
end

在这里注释就不写了,写的可能有点乱

SQL server学习_两表对照相关推荐

  1. SQL Server学习之路:建立数据库、建立表

    SQL Server学习之路:建立数据库.建立表 1.前言 配置是win10+SQL Server 2012,使用的GUI管理工具是SQL Server 2012自带的SQL Server Manag ...

  2. sas rename重命名_如何使用sp_rename命令在SQL Server中重命名表

    sas rename重命名 In this article, we will learn to rename tables in SQL Server. sp_rename is a built-in ...

  3. Sql server中如何将表A和表B的数据合并(乘积方式)

    sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...

  4. sql server死锁_了解SQL Server中的死锁定义

    sql server死锁 This article explains the deadlock definition in SQL Server, and it also mentions how t ...

  5. 用友U8的SQL SERVER 数据库结构说明表

    用友U8的SQL SERVER 数据库结构说明表       在帐套中的两个表,一个表是RPT_GRPDEF,存放帐套中重要的表名及相关说明:另一个是RPT_ITMDEF,存放的是主要表中的相关字段说 ...

  6. sql server 学习教程

    sql server 学习教程 SQL Server 系统数据库 master model msdb tempdb 索引 定义 分类 唯一索引 主键索引 聚集索引(Clustered) 非聚集索引(N ...

  7. SQL Server 2005 术语词汇表

    术语 定义 ActiveX 数据对象 (ActiveX Data Objects) 一种易于使用的应用程序编程接口 (API),用于封装 OLE DB 以在诸如 Visual Basic.Visual ...

  8. SQL Server 2014 内存优化表(1)实现内存优化表

    内存优化表(Memory-Optimized Tables)是SQL Server 2014的新特性,目前仅适用于评估版(Evaluation Edition).开发版(Developer Editi ...

  9. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

最新文章

  1. OpenCV 直方图的计算和绘制
  2. Java——this
  3. 高仿真的类-请求参数映射
  4. 选择结构_标准if-else语句
  5. java gc时自动收dump_Full GC分析:设置Java VM参数实现在Full GC前后自动生成Dump
  6. Hyperloop,让发布简洁高效
  7. Java面试 - HashMap的底层实现,之后会问ConcurrentHashMap的底层实现
  8. MySQL json-table-functions
  9. 刚刚,李彦宏首谈Uber致命车祸,还给了一个很“特别”的评价
  10. 持久化保存iptables规则
  11. Android之Adapter总结
  12. MS SQL SERVER中删除存在的临时表
  13. MarkDown编辑器中数学公式与符号-LaTeX 各种数学命令,符号
  14. 倍福--和威伦触摸屏通信
  15. win10计算机内存,win10多大内存够用 win10系统需要多大的运行内存
  16. gtk下的messagebox
  17. java跳转到ie_ie跳转chrome(ie浏览器点击链接跳转谷歌浏览器)
  18. Python3 juypterlab pyecharts 饼图制作
  19. php地区代码吗,将国家/地区名称转换为国家/地区代码缩写php
  20. python爬取豆瓣电影信息_Python爬虫入门 | 爬取豆瓣电影信息

热门文章

  1. 【动态规划】机器人路径规划——算法设计与分析慕课作业
  2. 购物车注册程序编写c语言,基于商城实例的小程序购物车云函数操作
  3. TypeScript error in....node_modules/@types/babel__traverse/index.d.ts(68,50):
  4. 计算机操作系统实验:银行家算法模拟
  5. 比尔盖茨在警察局留下的照片
  6. 微信拉黑的人怎么找回来?3个方法解决!
  7. python合并音频和视频_ffmpeg+Python实现B站MP4格式音频与视频的合并
  8. 物联网通信技术|课堂笔记week2-1|Linux网络管理基本命令
  9. run()和start()的区别
  10. (20)写一个函数,输入一个十六进制数,输出相应的十进制数