Ich versuche, ein Skript zu schreiben, das eine SQL Server-Datenbank vollständig leert. 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 ausführe, erhalte ich:
Befehl (e) erfolgreich abgeschlossen.
Aber wenn ich die Tabellenliste aktualisiere, sind sie alle noch da. Was mache ich falsch?
Antworten:
Es funktioniert auch bei mir nicht, wenn mehrere Fremdschlüsseltabellen vorhanden sind.
Ich habe den Code gefunden, der funktioniert und alles tut, was Sie versuchen (alle Tabellen aus Ihrer Datenbank löschen):
Den Beitrag finden Sie hier . Es ist der Beitrag von Groker.
quelle
Could not find stored procedure 'sp_MSForEachTable'.
dbo
. Wenn Sie benutzerdefinierte Schemata haben, müssen Sie Folgendes ändernsql
:SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.CONSTRAINT_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
sp_MSforeachtable
ist in Azure nicht verfügbar. Verwenden Sie stattdessen die Antwort von @ CountZero.Sie können alle Tabellen auch nur mit MSSMS-UI-Tools aus der Datenbank löschen (ohne SQL-Skript). Manchmal kann dieser Weg bequemer sein (besonders wenn er gelegentlich durchgeführt wird)
Ich mache das Schritt für Schritt wie folgt:
quelle
In SSMS:
Dadurch wird nun 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" anstelle der Auswahl zum Skripten der gesamten Datenbank nur die Elemente auswählen, die Sie entfernen möchten.
quelle
delete
wird zum Löschen von Zeilen aus einer Tabelle verwendet. Sie solltendrop table
stattdessen verwenden.quelle
NOCHECK CONSTRAINT
Zeile falsch?Die akzeptierte Antwort unterstützt Azure nicht. Es wird eine undokumentierte gespeicherte Prozedur "sp_MSforeachtable" verwendet. Wenn Sie beim Ausführen den Fehler "azure konnte die gespeicherte Prozedur 'sp_msforeachtable' nicht finden" erhalten oder einfach vermeiden möchten, sich auf undokumentierte Funktionen zu verlassen (die jederzeit entfernt oder deren Funktionalität geändert werden kann), versuchen Sie Folgendes.
Diese Version ignoriert die Entity Framework-Migrationsverlaufstabelle "__MigrationHistory" und die "database_firewall_rules", eine Azure-Tabelle, zu deren Löschung Sie nicht berechtigt sind.
Leicht auf Azure getestet. Stellen Sie sicher, dass dies keine unerwünschten Auswirkungen auf Ihre Umgebung hat.
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/
quelle
quelle
Sie haben fast Recht, verwenden Sie stattdessen:
In der zweiten Zeile müssen Sie möglicherweise mehr als einmal ausführen, bis kein Fehler mehr angezeigt wird:
Botschaft:
bedeutet, dass alle Tabellen erfolgreich gelöscht wurden.
quelle
Kurz und bündig:
quelle
sp_msforeachtable
durchsp_MSforeachtable
und würde empfehlen , ein hinzufügenuse yourdatabase
als erste Zeile. Lief wie am Schnürchen.Der schnellste Weg ist:
quelle
Scheint, der Befehl sollte ohne die quadratische Decke sein
quelle
Für mich der einfachste Weg:
quelle
Genau richtig !!
Mit der folgenden Abfrage können Sie alle Tabellen aus der Datenbank entfernen
EXEC sp_MSforeachtable @ command1 = "DROP TABLE?"
Viel Spaß beim Codieren!
quelle
Wie wäre es, die gesamte Datenbank zu löschen und dann erneut zu erstellen? Das funktioniert bei mir.
quelle
Ich weiß, dass dies jetzt ein alter Beitrag ist, aber ich habe alle Antworten hier in einer Vielzahl von Datenbanken ausprobiert und festgestellt, dass sie alle manchmal, aber nicht immer für verschiedene (ich kann nur annehmen) Macken von SQL Server funktionieren.
Irgendwann habe ich mir das ausgedacht. Ich habe dies überall getestet (im Allgemeinen), was ich kann, und es funktioniert (ohne versteckte Speicherprozeduren).
Hinweis hauptsächlich auf SQL Server 2014. (aber die meisten anderen Versionen, die ich ausprobiert habe, scheinen auch gut zu funktionieren).
Ich habe versucht, während Schleifen und Nullen usw. usw., Cursor und verschiedene andere Formen, aber sie scheinen immer auf einigen Datenbanken zu scheitern, aber nicht auf anderen ohne offensichtlichen Grund.
Eine Zählung zu erhalten und diese zum Iterieren zu verwenden, scheint immer bei allem zu funktionieren, was ich getestet habe.
quelle
Für temporäre Tabellen ist es etwas komplizierter, da es möglicherweise einige Fremdschlüssel gibt und auch eine Ausnahme:
Drop table operation failed on table XXX because it is not a supported operation on system-versioned temporal tables
Was Sie verwenden können, ist:
quelle