MSSQL Tüm Tabloları Silmek

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.

Share this Story

Related Posts

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir

Sponsor Bağlantılar

Sponsor Bağlantılar