SQL server学习_两表对照
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学习_两表对照相关推荐
- SQL Server学习之路:建立数据库、建立表
SQL Server学习之路:建立数据库.建立表 1.前言 配置是win10+SQL Server 2012,使用的GUI管理工具是SQL Server 2012自带的SQL Server Manag ...
- 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 ...
- Sql server中如何将表A和表B的数据合并(乘积方式)
sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...
- sql server死锁_了解SQL Server中的死锁定义
sql server死锁 This article explains the deadlock definition in SQL Server, and it also mentions how t ...
- 用友U8的SQL SERVER 数据库结构说明表
用友U8的SQL SERVER 数据库结构说明表 在帐套中的两个表,一个表是RPT_GRPDEF,存放帐套中重要的表名及相关说明:另一个是RPT_ITMDEF,存放的是主要表中的相关字段说 ...
- sql server 学习教程
sql server 学习教程 SQL Server 系统数据库 master model msdb tempdb 索引 定义 分类 唯一索引 主键索引 聚集索引(Clustered) 非聚集索引(N ...
- SQL Server 2005 术语词汇表
术语 定义 ActiveX 数据对象 (ActiveX Data Objects) 一种易于使用的应用程序编程接口 (API),用于封装 OLE DB 以在诸如 Visual Basic.Visual ...
- SQL Server 2014 内存优化表(1)实现内存优化表
内存优化表(Memory-Optimized Tables)是SQL Server 2014的新特性,目前仅适用于评估版(Evaluation Edition).开发版(Developer Editi ...
- 清空SQL Server数据库中所有表数据的方法(转)
清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...
最新文章
- OpenCV 直方图的计算和绘制
- Java——this
- 高仿真的类-请求参数映射
- 选择结构_标准if-else语句
- java gc时自动收dump_Full GC分析:设置Java VM参数实现在Full GC前后自动生成Dump
- Hyperloop,让发布简洁高效
- Java面试 - HashMap的底层实现,之后会问ConcurrentHashMap的底层实现
- MySQL json-table-functions
- 刚刚,李彦宏首谈Uber致命车祸,还给了一个很“特别”的评价
- 持久化保存iptables规则
- Android之Adapter总结
- MS SQL SERVER中删除存在的临时表
- MarkDown编辑器中数学公式与符号-LaTeX 各种数学命令,符号
- 倍福--和威伦触摸屏通信
- win10计算机内存,win10多大内存够用 win10系统需要多大的运行内存
- gtk下的messagebox
- java跳转到ie_ie跳转chrome(ie浏览器点击链接跳转谷歌浏览器)
- Python3 juypterlab pyecharts 饼图制作
- php地区代码吗,将国家/地区名称转换为国家/地区代码缩写php
- python爬取豆瓣电影信息_Python爬虫入门 | 爬取豆瓣电影信息
热门文章
- 【动态规划】机器人路径规划——算法设计与分析慕课作业
- 购物车注册程序编写c语言,基于商城实例的小程序购物车云函数操作
- TypeScript error in....node_modules/@types/babel__traverse/index.d.ts(68,50):
- 计算机操作系统实验:银行家算法模拟
- 比尔盖茨在警察局留下的照片
- 微信拉黑的人怎么找回来?3个方法解决!
- python合并音频和视频_ffmpeg+Python实现B站MP4格式音频与视频的合并
- 物联网通信技术|课堂笔记week2-1|Linux网络管理基本命令
- run()和start()的区别
- (20)写一个函数,输入一个十六进制数,输出相应的十进制数