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?
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.
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:
delete
wird zum Löschen von Zeilen aus einer Tabelle verwendet. Sie sollten stattdessen drop table
verwenden.
EXEC sp_msforeachtable 'drop table [?]'
/* 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
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.
In SSMS:
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.
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
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/
Der Befehl sollte ohne die quadratische Decke sein
EXEC sp_msforeachtable 'drop table ?'
Der schnellste Weg ist:
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;
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 ?'
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
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:
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.