23/10/2007 - Duplicate Kayıtları Silme İşlemi
Aşağıdaki sp; çalıştığım bir projede, veritabanında yer alan duplicate kayıtların sadece bir tanesinin kalıp, diğerlerinin silinmesini sağlayan bir sp idi.
Şimdi biraz daha düzenleyip, biraz daha anlaşılır hale getirmiş şekilde buraya ekliyorum. Umarım birilerinin işine yarar.
“SEARCH” tablosunda aynı “CODE” değerine sahip iki ya da daha fazla kayıt yer almasını istemiyorum.
Bunun için ilk olarak; SEARCH tablosundaki değerleri CODE değerine göre sıralayarak alıyorum. Böylece aynı CODE değerine sahip kayıtlar alt alta gelmiş olacak. Ben de ilk kayıda karışmayıp diğerlerini silecem.
Peki bunu nasıl yapacam. Burada rowcount parametresini kullanıyorum. Rowcount parametresi yapacağınız bir işlemden kaç kayıtın etkileneceğini gösterir.Böylece delete işlemi sırasında tüm kayıtlar değil, sadece 1 kayıt silinmiş olunacak. Dolayısıyla; aynı CODE değerine sahip diyelim ki 4 kaydım var her defasında sadece 1 tanesi silinecek. Ve en son 4 kayıttan elimde 1 kayıt kalmış olacaktır.
Alt alta gelen 2 kaydın aynı CODE değerine sahip olup olmadığı bilgisini ise; değerleri değişkenlerde tutup, birbirleri ile karşılaştırmak suretiyle elde ediyorum.
DECLARE @code_ float,
DECLARE @code_1 float,
DECLARE crSearch CURSOR FOR
SELECT CODE FROM SEARCH ORDER BY CODE
OPEN crSearch
FETCH NEXT FROM crSearch INTO @code_
set @code_1 = @code_
fetch next from crSearch into @code_
SET ROWCOUNT 1 --Bundan sonraki işlemlerden sadece 1 kayıt etkilenecek.
WHILE @@FETCH_STATUS=0
BEGIN
if @code_1=@code_
--Eğer bu eşitlik doğru ise dublicate kayıt var demektir.1 tanesi
--siliniyor.
begin
delete from SEARCH where CODE=@code_
print ' kayıt silindi...'
end
else
begin
set @code_1 = @code_
end
fetch next from crSearch into @code_
END
CLOSE crSearch
DEALLOCATE crSearch
--Hepsi Bu İşte!
|