Kimi zaman veritabanındaki tüm tabloları silip yerine yeni script içerisindeki tabloları eklemek istersiniz. Tek tek tabloları drop table yaparak silmek de bir seçenek elbette. Ancak çoğu zaman gerçekten eziyet haline gelebiliyor bu durum. Hele de çok sayıda tablonuz var ise.
İşte bu gibi durumlar için aşağıdaki kod kısaca işinizi çözecektir.
DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR
SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + '];'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME
OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql
WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END
CLOSE @Cursor DEALLOCATE @Cursor
GO
EXEC sp_MSforeachtable 'DROP TABLE ?'
GO
Kısaca şöyle özetleyeyim kodu isterseniz;
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + '];'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME
Bu blokta sql sizin için tüm ilişki şemasını aşağıdaki şekilde bir araya topluyor.
ALTER TABLE [dbo].[Musteriler_Adres] DROP [FK_Musteriler_Adres_Musteriler];
Tabii ki ne kadar ilişki var ise hepsini sıralı olarak listeliyor.
OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql
WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END
CLOSE @Cursor DEALLOCATE @Cursor
GO
Bu blokta da CURSOR yöntemi ile bu listede dönüp her satırda oluşturduğu alter ve drop komutlarını “Exec sp_executesql @Sql” satırı ile execute ediyor. Yani aslında çalıştırıyor.
Tabii ki tüm ilişkiler temizlendikten sonra iş tüm tabloların silinmesine geliyor. Burada da MSSQL’in kendi içerisindeki sp_MSforeachtable fonksiyonu devreye giriyor.
EXEC sp_MSforeachtable 'DROP TABLE ?'
Bu komut ile de “?” diyor, yani tüm tabloları diyorsunuz. Böylece tüm tablolarınız “drop” işlemine maruz kalmış oluyor.
MSSQL Tüm Prosedürleri Temizlemek
Aynı şekilde aşağıdaki kod örneği ile ilgili veri tabanındaki prosedürleri de temizleyebilirsiniz.
declare @procName varchar(500)
declare cur cursor
for select [name] from sys.objects where type = 'p'
open cur
fetch next from cur into @procName
while @@fetch_status = 0
begin
exec('drop procedure [' + @procName + ']')
fetch next from cur into @procName
end
close cur
deallocate cur