Ako odstrániť všetky tabuľky z databázy pomocou jedného dotazu SQL?

Nechcem zadávať všetky tabuľky' meno, aby som ich všetky vynechal. Je to možné pomocou jedného dotazu?

Riešenie

Na získanie zoznamu tabuliek použite zobrazenie INFORMATION_SCHEMA.TABLES. V príkaze select vygenerujte skripty Drop a vypustite ich pomocou dynamického 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 Verzia

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

Poznámka: Ak máte medzi tabuľkami definované nejaké zahraničné kľúče, potom najprv spustite nasledujúci dotaz, aby ste vypli všetky zahraničné kľúče prítomné vo vašej databáze.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Viac informácií nájdete skúmajte tu.

Komentáre (9)

Ak sa vám nechce písať, môžete vytvoriť príkazy pomocou tejto funkcie:

USE Databasename

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

Potom ho skopírujte a vložte do nového okna SSMS a spustite ho.

Komentáre (3)

Ja by som len urobil malú zmenu v odpovedi @NoDisplayName'a použil QUOTENAME() na stĺpec TABLE_NAME a zahrnul aj stĺpec TABLE_SCHEMA v prípade, že tabuľky nie sú v schéme 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;

Alebo pomocou pohľadov na schému sys (podľa komentára @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;
Komentáre (6)