Как удалить все таблицы в базе данных 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 ]

2 голосов
/ 24 февраля 2017

голодает путь:

  1. Новые диаграммы базы данных
  2. Добавить всю таблицу
  3. Ctrl + A, чтобы выбрать все
  4. Щелкните правой кнопкой мыши «Удалить из базы данных»
  5. Ctrl + S для сохранения
  6. Наслаждайтесь
1 голос
/ 04 августа 2015

Как насчет удаления всей базы данных и последующего ее создания? Это работает для меня.

DROP DATABASE mydb;
CREATE DATABASE mydb;
0 голосов
/ 04 февраля 2019

Если вы хотите удалить все таблицы, вы также можете удалить базу данных, а затем создать новую.

T-SQL:

DROP DATABASE NorthwindИДТИСОЗДАТЬ БАЗУ ДАННЫХ NorthwindGO

Для этого в SQL Management Studio (SSMS, в моем случае v 17.9.1):

  1. Щелкните правой кнопкой мыши по базе данныхвы хотите удалить, например "Northwind";Выберите «Удалить» в контекстном меню
  2. Щелкните правой кнопкой мыши «Базы данных» (значок папки);Выберите "Новая база данных ..."
  3. Введите имя базы данных , например, "Northwind";Нажмите OK

И все готово!У вас есть свежая база данных без таблиц.Преимущество этого подхода заключается в том, что вам не нужно заботиться о каких-либо ограничениях, запрещающих удалять таблицы, зависимые представления или SP, которые больше не работают, а также вам не нужны динамические сценарии SQL.Вы можете повторно добавить их позже, при условии, что вы сделали резервную копию, поэтому

Помните в резервную копию вашу базу данных до того, как вы это сделаете!Если вам просто нужны некоторые SP или представления, сохраните их как скрипт, прежде чем заново создавать базу данных, отредактируйте их, чтобы они работали с новыми таблицами, и добавьте их позже.

0 голосов
/ 24 декабря 2017

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

В конце концов я придумал это.Я проверял это везде (вообще говоря), я могу, и это работает (без каких-либо скрытых процедур магазина).

Для заметок, в основном о SQL Server 2014. (но большинство других версий, которые я пробовал, также, кажется, работало нормально).

Я пробовал циклы с нулем и т. Д. И т. Д., Курсоры и различныедругие формы, но они, похоже, всегда дают сбой в некоторых базах данных, но не в других без видимой причины.

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

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

WHILE @row_number > 0
BEGIN
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    SELECT @sql = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@sql)
    PRINT 'Dropped Table: ' + @name
    SET @row_number = @row_number - 1
END
GO
...