Sql Server 存储过程删除一个表里(除ID外)完全重复的数据记录


 1 CREATE PROCEDURE P_DeleteSameData
 2 (
 3     @table nvarchar(50),--表名
 4      @columns nvarchar(200)--列名,格式形如:Id,Name,Age
 5  )
 6  AS
 7  BEGIN
 8      BEGIN TRY
 9           BEGIN TRANSACTION
10              DECLARE @SQL NVARCHAR(1000),@tempTable NVARCHAR(20);
11              SET @SQL = ‘‘;
12              IF OBJECT_ID(‘[#tempTable]‘) IS NOT NULL
13              BEGIN
14                  --PRINT ‘aaa‘
15                  SET @SQL = @SQL + ‘DROP TABLE [dbo].[#tempTable]‘;
16              END
17              SET @tempTable = ‘[#tempTable]‘;
18              SET @SQL = @SQL + ‘SELECT * INTO ‘+@tempTable+‘ FROM ‘+@table+‘ WHERE 1<>1;‘;
19
20              --创建忽略重复列数据的临时表索引
21              SET @SQL = @SQL + ‘CREATE UNIQUE INDEX tempIndex ON ‘+@tempTable+‘(‘ + @columns + ‘) WITH IGNORE_DUP_KEY;‘;
22
23              --将源表中的数据插入临时表中,同时会忽略重复列的数据,所以此时临时表中的数据已经是去重的数据了
24              SET @SQL = @SQL + ‘INSERT INTO ‘+@tempTable+‘(‘+@columns+‘) SELECT ‘ + @columns + ‘ FROM ‘ + @table + ‘;‘;
25
26              --清空源表数据
27              SET @SQL = @SQL + ‘TRUNCATE TABLE ‘ + @table + ‘;‘;
28              --将临时表中的数据再复制到源表中
29              SET @SQL = @SQL + ‘INSERT INTO ‘+@table+‘(‘+@columns+‘) SELECT ‘+@columns+‘ FROM ‘+@tempTable+‘;‘;
30              SET @SQL = @SQL + ‘DROP TABLE ‘+@tempTable + ‘;‘;
31          --动态执行上面的所有语句
32              EXEC(@SQL);
33
34          COMMIT TRANSACTION
35      END TRY
36      BEGIN CATCH
37          ROLLBACK TRANSACTION
38          DECLARE @msg nvarchar(4000)
39          SET @msg=error_message();
40          RAISERROR(@msg,11,1)
41          RETURN 1;
42      END CATCH
43  END


 

执行示例代码如下:

1 EXEC P_DeleteSameData @table = ‘T_Teacher‘, @columns=‘Name,Age‘

使用上述存储过程时要注意的是:

1.如果去重的表主键ID为自动增长或者自动生成GUID,即该表不可能在该列产生重复,则不能把该ID列传入@columns里,形如:@columns=‘StuName,StuAge,StuSex‘,

如果要满足该表所有列都要求不重复则:@columns=‘StuID,StuName,StuAge,StuSex‘这样的形式。

2.有的同学或者同仁要问为什么要把所有的语句拼接到一起在最后执行?因为中间是用了临时表,而临时表的作用域(作用域是计算机编程里的一个术语,如果你有幸看到此篇文章,相信大家都懂得~)只能在同一个动态语句中,所以在最后连带临时表一起动态执行。还有一个办法就是可以使用全局临时表,不过耗费资源,所以不推荐。

时间: 2024-12-23 22:09:47

Sql Server 存储过程删除一个表里(除ID外)完全重复的数据记录的相关文章

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

【转】sql server 获取每一个类别中值最大的一条数据

1 /* 2 数据如下: 3 name val memo 4 a 2 a2(a的第二个值) 5 a 1 a1--a的第一个值 6 a 3 a3:a的第三个值 7 b 1 b1--b的第一个值 8 b 3 b3:b的第三个值 9 b 2 b2b2b2b2 10 b 4 b4b4 11 b 5 b5b5b5b5b5 12 */ 13 --创建表并插入数据: 14 create table tb(name varchar(10),val int,memo varchar(20)) 15 insert

一个云端充值的Sql Server存储过程示例

一个云端充值的Sql Server存储过程示例 一.充值相关的表: 1.充值要变更tb_Customer表 LeftMoney ,当前余额 , 需要加上充值额DepositSum ,充值总额 , 需要加上充值额ConsumeNo ,卡操作序号 ,需要加1 ForceAct 用leftmoney去强制同步cardleftmoney,是一个"卡片修复的行为" UnInformedMoney 若ForceAct的值是单数,不需要变动;若是0或双数,则要加上充值额 2.在tb_Operlog中

sql server快速删除整个数据库表和存储过程

情况:在远程数据库删除表执行太慢,表过多,数据库无权删除 结果:保留空数据库 方法:利用sql语句,查询网络文摘解决. 说明: 有些有约束,不能直接delete,需要先删除所有约束,语句: DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; ' from sysobjects where xtype = 'F' open c1 declare

SQL Server存储过程的初步认知

什么是存储过程? 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.实际上存储过程就是能完成一定操作的一组SQL语句. 为什么要用存储过程? 1.  存储过程只在创造时候编译,以后每次执行存储过程都不需要再重新的编译,而一般的SQL语句每执行一次就需要编译一次,所以使用存储过程可提高数据库执行速度. 2.  当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事物处理结合在一起. 3.  存储过程可以重复的使用,降低开发人员的工作量,提高工作效率. 4.  安全

SQL Server 存储过程(转载)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL SERVER 2005删除维护作业报错:The DELETE statement conflicted with the REFERENCE constraint &quot;FK_subplan_job_id&quot;

案例环境: 数据库版本: Microsoft SQL Server 2005 (Microsoft SQL Server 2005 - 9.00.5000.00 (X64) ) 案例介绍: 对一个数据库实例做清理工作时,发现有一个很久之前禁用的数据库维护作业,于是遂删除该作业,但是删除该作业时,遇到如下错误: 脚本删除操作: USE [msdb] GO EXEC msdb.dbo.sp_delete_job @job_id=N'876ab683-6d81-47c4-bba2-0dfa581561

SQL Server 存储过程(转)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL Server存储过程的使用

存储过程概述 简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理. 基本概念: SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便的从系统表中查询信息, 或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口. 存储过程就是SQL Server为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上, 有数据库服务器通