Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment tronquer toutes les tables d'une base de données à l'aide de TSQL ?

Lorsqu'il s'agit de supprimer des données de tables qui ont des relations de clé étrangère - ce qui est fondamentalement le cas avec toute base de données correctement conçue - nous pouvons désactiver toutes les contraintes, supprimer toutes les données, puis réactiver les contraintes

-- 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"

Plus d'informations sur la désactivation des contraintes et des déclencheurs ici

si certaines tables ont des colonnes d'identité, nous voudrons peut-être les réamorcer

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

Notez que le comportement de RESEED diffère entre une toute nouvelle table et une table dans laquelle des données avaient été insérées précédemment à partir de BOL :

DBCC CHECKIDENT ('table_name', RESEED, newReseedValue)

La valeur d'identité actuelle est définie sur newReseedValue. Si aucune ligne n'a été insérée dans la table depuis sa création, la première ligne insérée après l'exécution de DBCC CHECKIDENT utilisera newReseedValue comme identité. Sinon, la ligne suivante insérée utilisera newReseedValue + 1. Si la valeur de newReseedValue est inférieure à la valeur maximale dans la colonne d'identité, le message d'erreur 2627 sera généré lors des références ultérieures à la table.

Merci à Robert d'avoir souligné le fait que la désactivation des contraintes ne permet pas d'utiliser truncate, les contraintes devraient être supprimées, puis recréées