Hepsini bırakmak için tüm tabloların adını yazmak istemiyorum. Tek bir sorgu ile mümkün mü?
Tabloların listesini almak için INFORMATION_SCHEMA.TABLES görünümünü kullanın. Select deyiminde Drop komut dosyaları oluşturun ve Dynamic SQL kullanarak bırakın:
DECLARE @sql NVARCHAR(max)=''
SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
Exec Sp_executesql @sql
Sys.Tables Sürüm
DECLARE @sql NVARCHAR(max)=''
SELECT @sql += ' Drop table ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM sys.tables t
JOIN sys.schemas s
ON t.[schema_id] = s.[schema_id]
WHERE t.type = 'U'
Exec sp_executesql @sql
Not: Tablolar arasında tanımlanmış herhangi bir yabancı Anahtar
varsa, önce veritabanınızda bulunan tüm yabancı anahtarları
devre dışı bırakmak için aşağıdaki sorguyu çalıştırın.
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Daha fazla bilgi için, burayı kontrol edin.
Eğer yazmak istemiyorsanız, ifadeleri bu şekilde oluşturabilirsiniz:
USE Databasename
SELECT 'DROP TABLE [' + name + '];'
FROM sys.tables
Ardından, çalıştırmak için kopyalayıp yeni bir SSMS penceresine yapıştırın.
Ben olsam @NoDisplayName'in cevabında küçük bir değişiklik yapardım ve TABLE_NAME
sütununda QUOTENAME()
kullanırdım ve tabloların dbo
şemasında olmaması durumunda TABLE_SCHEMA
sütununu da eklerdim.
DECLARE @sql nvarchar(max) = '';
SELECT @sql += 'DROP TABLE ' + QUOTENAME([TABLE_SCHEMA]) + '.' + QUOTENAME([TABLE_NAME]) + ';'
FROM [INFORMATION_SCHEMA].[TABLES]
WHERE [TABLE_TYPE] = 'BASE TABLE';
EXEC SP_EXECUTESQL @sql;
Ya da sys
şema görünümlerini kullanarak (@swasheck'in yorumuna göre):
DECLARE @sql nvarchar(max) = '';
SELECT @sql += 'DROP TABLE ' + QUOTENAME([S].[name]) + '.' + QUOTENAME([T].[name]) + ';'
FROM [sys].[tables] AS [T]
INNER JOIN [sys].[schemas] AS [S] ON ([T].[schema_id] = [S].[schema_id])
WHERE [T].[type] = 'U' AND [T].[is_ms_shipped] = 0;
EXEC SP_EXECUTESQL @sql;