Sql Server 預存程序刪除一個表裡(除ID外)完全重複的資料記錄

來源:互聯網
上載者:User

標籤:


 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 TRANSACTION10              DECLARE @SQL NVARCHAR(1000),@tempTable NVARCHAR(20);11              SET @SQL = ‘‘;12              IF OBJECT_ID(‘[#tempTable]‘) IS NOT NULL13              BEGIN14                  --PRINT ‘aaa‘15                  SET @SQL = @SQL + ‘DROP TABLE [dbo].[#tempTable]‘;16              END17              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 TRANSACTION35      END TRY36      BEGIN CATCH37          ROLLBACK TRANSACTION38          DECLARE @msg nvarchar(4000)39          SET @msg=error_message();40          RAISERROR(@msg,11,1)41          RETURN 1;42      END CATCH43  END
View Code

 

 

執行範例程式碼如下:

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.有的同學或者同仁要問為什麼要把所有的語句拼接到一起在最後執行?因為中間是用了暫存資料表,而暫存資料表的範圍(範圍是電腦編程裡的一個術語,如果你有幸看到此篇文章,相信大家都懂得~)只能在同一個動態語句中,所以在最後連帶暫存資料表一起動態執行。還有一個辦法就是可以使用全域暫存資料表,不過耗費資源,所以不推薦。

 

Sql Server 預存程序刪除一個表裡(除ID外)完全重複的資料記錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.