Kako z eno poizvedbo SQL opustiti vse tabele iz zbirke podatkov?

Ne želim vnesti vseh tabel, da bi jih spustil. Ali je to mogoče z eno poizvedbo?

Rešitev

Uporabite pogled INFORMATION_SCHEMA.TABLES za pridobitev seznama tabel. V ukazu select ustvarite skripte Drop in jih spustite z uporabo dinamičnega SQL:

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 Različica

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

Pomnilo: Če imate med tabelami opredeljene tuje ključe, najprej izvedite spodnjo poizvedbo, da izključite vse tuje ključe, ki so prisotni v vaši zbirki podatkov.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Za več informacij poglejte tukaj.

Komentarji (9)

Če ne želite tipkati, lahko izjave ustvarite s tem:

USE Databasename

SELECT  'DROP TABLE [' + name + '];'
FROM    sys.tables

Nato ga kopirajte in prilepite v novo okno SSMS, da ga zaženete.

Komentarji (3)

Samo malo bi spremenil odgovor @NoDisplayName in uporabil QUOTENAME() za stolpec TABLE_NAME in vključil tudi stolpec TABLE_SCHEMA, če tabele niso v shemi dbo.

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;

Ali z uporabo sys pogledov na sheme (kot je zapisano v komentarju @swasheck'a):

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;
Komentarji (6)