Как удалить все таблицы в базе данных SQL Server? - PullRequest
146 голосов
/ 09 декабря 2011

Я пытаюсь написать скрипт, который полностью очистит базу данных SQL Server. Это то, что я до сих пор:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

Когда я запускаю его в Management Studio, я получаю:

Команда (и) успешно выполнена.

но когда я обновляю список таблиц, они все еще там. Что я делаю не так?

Ответы [ 14 ]

244 голосов
/ 25 апреля 2014

Вы также можете удалить все таблицы из базы данных, используя только инструменты MSSMS (без использования sql).Иногда этот способ может быть более удобным (особенно если он выполняется время от времени)

Я делаю это шаг за шагом следующим образом:

  1. Выберите «Таблицы» в дереве базы данных (Object Explorer)
  2. Нажмите клавишу F7, чтобы открыть представление «Подробности обозревателя объектов»
  3. . В этом представлении выберите таблицы, которые необходимо удалить (в данном случае все они)
  4. Нажимайте кнопку Удалить, пока все таблицы не будут удалены.удаляются (вы повторяете столько раз, сколько ошибок из-за ключевых ограничений / зависимостей)
240 голосов
/ 09 декабря 2011

Это также не работает для меня, когда есть несколько таблиц внешнего ключа.Я нашел этот код, который работает и делает все, что вы пытаетесь (удалить все таблицы из вашей базы данных):

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

Вы можете найти пост здесь .Это сообщение от Groker.

32 голосов
/ 09 декабря 2011

delete используется для удаления строк из таблицы.Вы должны использовать drop table вместо.

EXEC sp_msforeachtable 'drop table [?]'
23 голосов
/ 21 февраля 2013
/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO
17 голосов
/ 17 апреля 2018

В SSMS:

  • Щелкните правой кнопкой мыши базу данных
  • Перейдите в «Задачи»
  • Нажмите «Создать сценарии»
  • В поле «Выберите «Объекты», выберите «Сценарий всей базы данных и всех объектов базы данных»
  • В разделе «Настройка параметров сценариев» нажмите кнопку «Дополнительно»
  • На переключателе «Сценарий DROP and CREATE»"Script CREATE" для "Script DROP" и нажмите OK
  • Затем либо сохраните в файл, буфер обмена или новое окно запроса.
  • Запустите скрипт.

Теперь это отбросит все, включая базу данных.Убедитесь, что удалили код для предметов, которые вы не хотите отбрасывать.Кроме того, в разделе «Выбор объектов» вместо выбора сценария для всей базы данных просто выберите элементы, которые вы хотите удалить.

17 голосов
/ 08 января 2014

Вы почти правы, используйте вместо:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

но вторую строку вам может потребоваться выполнить несколько раз, пока вы не перестанете получать ошибку:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

Сообщение:

Command(s) completed successfully.

означает, что все таблицы были успешно удалены.

14 голосов
/ 31 марта 2017

Принятый ответ не поддерживает Azure. Он использует недокументированную хранимую процедуру "sp_MSforeachtable". Если вы получаете сообщение об ошибке «Azure не удалось найти хранимую процедуру« sp_msforeachtable »при запуске или просто хотите избежать использования недокументированных функций (которые можно удалить или изменить их функциональность в любой момент)», попробуйте следующее

Эта версия игнорирует таблицу истории миграции инфраструктуры объектов "__MigrationHistory" и "database_firewall_rules", которые являются таблицей Azure, у вас не будет разрешения на удаление.

Слегка протестировано на Azure. Убедитесь, что это не имеет нежелательных последствий для вашей среды.

DECLARE @sql NVARCHAR(2000)

WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY'))
BEGIN
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC(@sql)
    PRINT @sql
END

WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'))
BEGIN
    SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'
    EXEC(@sql)
    PRINT @sql
END

Взято из:

https://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/

http://www.sqlservercentral.com/blogs/sqlservertips/2011/10/11/remove-all-foreign-keys/

14 голосов
/ 16 сентября 2016

Коротко и сладко:

USE YOUR_DATABASE_NAME
-- Disable all referential integrity constraints
EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Drop all PKs and FKs
declare @sql nvarchar(max)
SELECT @sql = STUFF((SELECT '; ' + 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('')),1,1,'')
EXECUTE (@sql)
GO

-- Drop all tables
EXEC sp_MSforeachtable 'DROP TABLE ?'
GO
4 голосов
/ 22 июня 2016

Кажется, что команда должна быть без квадратного одеяла

EXEC sp_msforeachtable 'drop table ?'
3 голосов
/ 12 января 2018

Для меня самый простой способ:

--First delete all constraints

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

EXEC sys.sp_executesql @sql;

-- Then drop all tables

exec sp_MSforeachtable 'DROP TABLE ?'
...