標籤:
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外)完全重複的資料記錄