it-swarm.com.de

Wie werden alle Tabellen in einer SQL Server-Datenbank gelöscht?

Ich versuche, ein Skript zu schreiben, das eine SQL Server-Datenbank vollständig entleert. Das habe ich bisher:

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

Wenn ich es im Management Studio starte, bekomme ich:

Befehl (en) erfolgreich ausgeführt.

aber wenn ich die tischliste auffrische, sind sie alle noch da. Was mache ich falsch?

129
dixuji

Es funktioniert auch nicht für mich, wenn es mehrere Fremdschlüsseltabellen gibt.
Ich fand den Code, der funktioniert und alles tut, was Sie versuchen (alle Tabellen aus Ihrer Datenbank löschen)

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + 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

Sie finden die Post hier . Es ist die Post von Groker.

216
Gabriel GM

Sie können auch alle Tabellen mit nur MSSMS-Tools (ohne Verwendung von SQL) aus der Datenbank löschen. Manchmal kann dieser Weg komfortabler sein (besonders wenn er gelegentlich ausgeführt wird)

Ich mache das Schritt für Schritt wie folgt:

  1. Wählen Sie "Tabellen" in der Datenbankstruktur (Object Explorer) aus.
  2. Drücken Sie F7, um die Detailansicht des Objekt-Explorers zu öffnen
  3. Wählen Sie in dieser Ansicht Tabellen aus, die gelöscht werden müssen (in diesem Fall alle).
  4. Drücken Sie die Entf-Taste, bis alle Tabellen gelöscht sind (Sie wiederholen es so oft, wie es aufgrund von Einschränkungen oder Abhängigkeiten zu Fehlern kommt)
216
Bronek

delete wird zum Löschen von Zeilen aus einer Tabelle verwendet. Sie sollten stattdessen drop table verwenden.

EXEC sp_msforeachtable 'drop table [?]'
30
DaveShaw
/* 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
22
Harpal

Sie haben fast recht, verwenden Sie stattdessen:

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

in der zweiten Zeile müssen Sie jedoch mehrmals ausführen, bis Sie keine Fehlermeldung mehr erhalten:

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

Botschaft:

Command(s) completed successfully.

bedeutet, dass alle Tabellen erfolgreich gelöscht wurden.

15
Michał Powaga

In SSMS: 

  • Klicken Sie mit der rechten Maustaste auf die Datenbank
  • Gehe zu "Aufgaben"
  • Klicken Sie auf "Generate Scripts".
  • Wählen Sie im Bereich "Choose Objects" die Option "Script gesamte Datenbank und alle Datenbankobjekte" aus.
  • Klicken Sie im Abschnitt "Skriptoptionen einstellen" auf die Schaltfläche "Erweitert"
  • Bei "Script DROP und CREATE" schalten Sie "Script CREATE" auf "Script DROP" und drücken Sie OK
  • Speichern Sie dann entweder in eine Datei, in die Zwischenablage oder in ein neues Abfragefenster.
  • Skript ausführen.

Jetzt wird alles gelöscht, einschließlich der Datenbank. Stellen Sie sicher, dass Sie den Code für die Elemente entfernen, die nicht gelöscht werden sollen. Alternativ können Sie im Abschnitt "Objekte auswählen" nicht die gesamte Datenbank als Skript auswählen, sondern nur die Elemente auswählen, die Sie entfernen möchten.

14
Ben

Kurz und bündig:

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
13
Richard Pierre

Die akzeptierte Antwort unterstützt Azure nicht. Es verwendet eine undokumentierte gespeicherte Prozedur "sp_MSforeachtable". Wenn Sie beim Ausführen den Fehler "Azure konnte die gespeicherte Prozedur 'sp_msforeachtable" nicht finden oder einfach vermeiden wollen, dass Sie auf nicht dokumentierte Funktionen (die entfernt werden können oder deren Funktionalität geändert werden kann), versuchen Sie Folgendes. 

Diese Version ignoriert die Migrationsverlaufstabelle des Entitäts-Frameworks "__MigrationHistory" und die "database_firewall_rules", bei der es sich um eine Azure-Tabelle handelt, für die Sie keine Berechtigung zum Löschen haben. 

Auf Azure leicht getestet. Prüfen Sie dies, um sicherzustellen, dass dies keine unerwünschten Auswirkungen auf Ihre Umgebung hat. 

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

Genommen von:

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/

10
CountZero

Der Befehl sollte ohne die quadratische Decke sein

EXEC sp_msforeachtable 'drop table ?'
4
Jimmy Wong

Der schnellste Weg ist:

  1. Neue Datenbankdiagramme
  2. Alle Tabelle hinzufügen
  3. Strg + A, um alle auszuwählen
  4. Rechtsklick "Aus Datenbank entfernen"
  5. Strg + S zum Speichern
  6. Genießen
2
TuanDPH

Wie wäre es, wenn Sie die gesamte Datenbank löschen und erneut erstellen? Das funktioniert für mich.

DROP DATABASE mydb;
CREATE DATABASE mydb;
1
Chong Lip Phang

Für mich der einfachste Weg:

--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 ?'
0
Jeffrey

Ich weiß, dass dies jetzt ein alter Beitrag ist, aber ich habe alle Antworten hier auf einer Vielzahl von Datenbanken ausprobiert, und ich habe festgestellt, dass sie alle manchmal funktionieren, aber nicht die ganze Zeit für verschiedene (ich kann nur annehmen) Macken von SQL Server.

Irgendwann habe ich mir das ausgedacht. Ich habe dies überall getestet (in der Regel) und kann (ohne versteckte Speicherprozeduren) funktionieren. 

Hinweis hauptsächlich auf SQL Server 2014. (Aber die meisten anderen Versionen, die ich ausprobiert habe, scheinen auch gut zu funktionieren).

Ich habe zwar Schleifen und Nullen usw., Cursors und verschiedene andere Formen ausprobiert, aber sie scheinen in einigen Datenbanken immer zu versagen, andere jedoch ohne ersichtlichen Grund.

Eine Zählung zu erhalten und diese zu verwenden, scheint immer bei allem zu funktionieren, was ich getestet habe.

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
0

Wenn Sie alle Tabellen löschen möchten, können Sie auch die Datenbank löschen und dann eine neue erstellen. 

T-SQL:

DROP DATABASE Nordwind 
GEHEN 
DATENBANK ERSTELLEN Nordwind 
GEHEN

Um dies in SQL Management Studio (SSMS in meinem Fall v 17.9.1) zu erreichen:

  1. Klicken Sie mit der rechten Maustaste auf die Datenbank, die Sie löschen möchten, z. "Nordwind"; 
    .__ Wählen Sie im Kontextmenü "Löschen"
  2. Klicken Sie mit der rechten Maustaste auf "Databases" (Ordnersymbol). 
    Wählen Sie "Neue Datenbank ...".
  3. Geben Sie den Datenbanknamen ein, z. "Nordwind"; 
    Klicken Sie auf OK.

Und du bist fertig! Sie haben eine frische Datenbank ohne Tabellen. Der Vorteil dieses Ansatzes ist, dass Sie sich nicht um irgendwelche Einschränkungen kümmern müssen, das Löschen von Tabellen, abhängigen Ansichten oder SPs, die nicht mehr funktionieren, oder das Sie keine dynamischen SQL-Skripts benötigen. Sie können diese später erneut hinzufügen, sofern Sie ein Backup erstellt haben

Erinnere dich an an Backup deiner Datenbank bevor du das machst! Wenn Sie nur einige SPs oder Ansichten benötigen, speichern Sie sie als Skript, bevor Sie die Datenbank neu erstellen, bearbeiten Sie sie, damit sie mit den neuen Tabellen arbeiten und sie später hinzufügen.

0
Matt