Как удалить все таблицы из БД? Невозможно удалить из sys.tables - PullRequest
6 голосов
/ 10 января 2011

Как я могу выполнить этот запрос любым способом:

delete from sys.tables where is_ms_shipped = 0

Что случилось, я выполнил очень большой запрос и забыл поместить директиву USE поверх него, теперь я получилzillion таблиц на моей главной базе данных, и я не хочу удалять их одну за другой.

ОБНОВЛЕНИЕ: Это совершенно новая база данных, поэтому мне не нужно заботиться о каких-либо предыдущих данных, окончательный результатхочу добиться - сбросить мастер-базу до заводских отгрузок.

Ответы [ 7 ]

7 голосов
/ 10 января 2011

Если это однократная проблема, используйте SQL Server Management Studio для удаления таблиц.

Если вам нужно запустить скрипт очень, очень , осторожно используйте это:

EXEC sp_msforeachtable 'DROP TABLE ?'
3 голосов
/ 10 января 2011

Один метод, который я использовал в прошлом, который был довольно простым и относительно надежным, - это запрос системных таблиц / информационной схемы (в зависимости от точных требований) и вывод из нее списка команд, которые я хочу выполнить в качестве набора результатов.,Просмотрите это, скопируйте и вставьте, запустите - быстро и легко для одноразовой работы, и, поскольку вы все еще вручную нажимаете кнопку разрушительного бита, (ИМХО) сложнее отменить вещи по ошибке.Например:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0
2 голосов
/ 10 января 2011

Нет резервных копий?: -)

Одним из подходов может быть создание проекта базы данных в Visual Studio с первоначальным импортом базы данных.Затем удалите таблицы и синхронизируйте проект обратно в базу данных.Вы можете выполнять массовое удаление с помощью этого подхода, будучи "буферизованным" с фазой фиксации и пользовательским интерфейсом.

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

О, и что бы ни делалось, сначала создайте резервную копию.Если ничего другого, это хорошая тренировка: -)

1 голос
/ 28 декабря 2011

Я сделал нечто действительно похожее, и в итоге я использовал базу данных сценариев Tasks ->, чтобы только отбрасывать сценарии для всех объектов базы данных изначально предназначенной базы данных.Имеется в виду база данных, на которой я должен был запустить гигантский скрипт, на котором я его запускал.Обязательно включите IF Exists в дополнительные параметры, затем запустите этот сценарий для мастера и BAM, удалите все, что существует в исходной целевой базе данных, которая также существует в мастере, оставив различия, которые должны быть исходными основными элементами.

1 голос
/ 01 ноября 2011

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

DECLARE 
    @Prefix VARCHAR(50),
    @TableName NVARCHAR(255),
    @SQLToFire NVARCHAR(350)

SET @Prefix = 'upgrade_%'

WHILE EXISTS(
    SELECT
        name
    FROM
        sys.tables
    WHERE
        name like @Prefix
    )
BEGIN
    SELECT
        TOP 1   --This query only iterates if you are dropping tables
        @TableName = name
    FROM
        sys.tables
    WHERE
        name like @Prefix

    SET @SQLToFire = 'DROP TABLE ' + @TableName

    EXEC sp_executesql @SQLToFire;
END
1 голос
/ 10 января 2011

Простейшим и кратчайшим способом, который я сделал, было следующее:

Как перестроить системные базы данных в SQL Server 2008

Проблема со всеми другими ответами здесь заключается в том, чтоне работает, так как есть связанные таблицы, и он отказывается выполнять.

Эта, не только она работает, но на самом деле то, что я ищу: «Сброс к заводским настройкам по умолчанию», как указано в вопросе.
Также этот удалит все, не только таблицы.

1 голос
/ 10 января 2011

Не очень элегантно, но поскольку это однократная задача.

WHILE EXISTS(SELECT * FROM sys.tables where is_ms_shipped = 0) 
      EXEC sp_MSforeachtable 'DROP TABLE ?'

Отлично работает в этом простом тесте (очистка a во втором цикле после неудачного завершения первой попытки и последующее удалениеb)

create table a
(
a int primary key
)
go

create table b
(
a int references a (a)
)

insert into a values (1)

insert into b values (1)
...