sql >> Databasteknik >  >> RDS >> Sqlserver

Hur trunkerar man alla tabeller i en databas med TSQL?

När vi hanterar radering av data från tabeller som har främmande nyckelrelationer - vilket i princip är fallet med vilken som helst korrekt designad databas - kan vi inaktivera alla begränsningar, ta bort all data och sedan återaktivera begränsningar

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

Mer om att inaktivera begränsningar och utlösare här

om några av tabellerna har identitetskolumner kanske vi vill se om dem

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

Observera att RESEEDs beteende skiljer sig mellan en helt ny tabell och en som tidigare hade infogat data från BOL:

DBCC CHECKIDENT ('table_name', RESEED, newReseedValue)

Det aktuella identitetsvärdet är inställt på newReseedValue. Om inga rader har infogats i tabellen sedan den skapades kommer den första raden som infogas efter att ha kört DBCC CHECKIDENT att använda newReseedValue som identitet. Annars kommer nästa rad som infogas att använda newReseedValue + 1. Om värdet på newReseedValue är mindre än maximivärdet i identity-kolumnen felmeddelande 2627 kommer att genereras vid efterföljande referenser till tabellen.

Tack till Robert för att han påpekade det faktum att inaktivering av begränsningar inte tillåter användning av trunkering, begränsningarna måste tas bort och sedan återskapas



  1. 2 funktioner som returnerar månaden från ett datum i Oracle

  2. Hur man hittar den sista dagen i månaden i SQL Server

  3. Identitetsliknande kolumn men baserad på Group By-kriterier

  4. TSQL - Hur använder man GO inuti ett BEGIN .. END-block?