Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie schneiden Sie alle Tabellen in einer Datenbank mit TSQL ab?

Wenn es darum geht, Daten aus Tabellen zu löschen, die Fremdschlüsselbeziehungen haben – was im Grunde bei jeder richtig gestalteten Datenbank der Fall ist – können wir alle Beschränkungen deaktivieren, alle Daten löschen und dann Beschränkungen wieder aktivieren

-- disable all constraints
EXEC sp_MSForEachTable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- delete data in all tables
EXEC sp_MSForEachTable "DELETE FROM ?"

-- enable all constraints
exec sp_MSForEachTable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Mehr zum Deaktivieren von Beschränkungen und Auslösern hier

Wenn einige der Tabellen Identitätsspalten haben, möchten wir sie vielleicht neu setzen

EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"

Beachten Sie, dass sich das Verhalten von RESEED zwischen einer brandneuen Tabelle und einer Tabelle unterscheidet, in die zuvor einige Daten aus BOL eingefügt wurden:

DBCC CHECKIDENT ('table_name', RESEED, newReseedValue)

Der aktuelle Identitätswert wird auf den neuen ReseedValue gesetzt. Wenn seit der Erstellung keine Zeilen in die Tabelle eingefügt wurden, verwendet die erste nach dem Ausführen von DBCC CHECKIDENT eingefügte Zeile newReseedValue als Identität. Andernfalls verwendet die nächste eingefügte Zeile newReseedValue + 1. Wenn der Wert von newReseedValue kleiner als der Maximalwert in der Identitätsspalte ist, Fehlermeldung 2627 wird bei nachfolgenden Verweisen auf die Tabelle generiert.

Danke an Robert für den Hinweis, dass das Deaktivieren von Constraints die Verwendung von truncate nicht erlaubt, die Constraints müssten gelöscht und dann neu erstellt werden