İçeriğe geç

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.

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
0 0 votes
Article Rating
Tarih:Microsoft SQL ServerMSSQL Server
Subscribe
Bildir
guest
0 Yorum
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x