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
View Code

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-04
  • 2022-02-11
  • 2021-10-12
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-06-06
  • 2022-01-25
  • 2022-12-23
  • 2022-02-08
  • 2022-12-23
相关资源
相似解决方案