sql >> Databasteknik >  >> RDS >> Sqlserver

Trunkera alla tabeller i en databas i SQL Server - SQL Server / TSQL Tutorial Del 55

Scenario:

Låt oss tänka på en databas som vi använder för vår ETL-process och vi kallar den databasstaging. Vi vill trunkera alla tabeller på morgonen så att de kan användas för den dagliga processen. En gång sättet är att skriva vår Truncate-sats för varje tabell, men tabeller kan släppas eller nya tabeller kan också skapas. Vi vill skriva en fråga som vi kan använda för att Trunkera alla tabeller från en databas och vi behöver inte skriva om våra Truncate-satser.

Om tabellerna inte har Primary Key -Foreign Key relation kan vi använda Truncate. Men vi har ofta tabeller som refereras av andra tabeller. Vi kan inte använda Truncate-satsen för dessa tabeller. Det enda sättet att trunkera dessa tabeller är att släppa den främmande nyckelbegränsningen före trunkering och sedan trunkera och återskapa relation efter det.

Koden nedan kan användas för att trunkera alla tabeller från databasen. Om tabeller kommer att ha Pk-Fk-relationen, kommer skriptet att släppa begränsningarna för främmande nyckel först och sedan trunkera dessa tabeller och slutligen återskapa begränsningarna för främmande nyckel.

Innan du kör under skriptet, se till att du är pekar på korrekt databas och server! Lycka till med att trunkera alla tabeller från en SQL Server-databas.


-- Släpp Temp-tabeller om det finns
OM OBJECT_ID('tempdb..#DropConstraint') INTE ÄR NULL
SLIPP TABELL #DropConstraint

OM OBJECT_ID('tempdb..#CreateConstraint') INTE ÄR NULL
SLIPP TABELL #CreateConstraint

OM OBJECT_ID('tempdb..#TempTruncateTables') INTE ÄR NULL
SLIPP TABELL #TempTruncateTables


-- Drop Constraint Script Spara i #DropConstraint Temp Table
VÄLJ 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' DROP CONSTRAINT ' + '[' + FK.name + ']' AS DropConstraintQuery

INTO #DropConstraint
FRÅN sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC
PÅ FK.OBJECT_ID =FKC.constraint_object_id
INNER JOIN sys.objects O
ON O.OBJECT_ID =FKC.parent_object_id


-- Skapa begränsningsskript Spara i #CreateConstraint Temp-tabell
VÄLJ 'ÄNDRA TABELL ' + '['
+ Schema_name(o.schema_id) + '].' + '['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' ADD CONSTRAINT ' + '[' + FK.name
+ '] Främmande nyckel (['
+ (VÄLJ namn
FRÅN sys.columns c
WHERE c.OBJECT_ID =FKC.parent_object_id
OCH c.column_id =FKC.parent_column_id)
+ ']) REFERENSER ' + '['
+ Schema_name(o.schema_id) + '].['
+ (VÄLJ namn
FRÅN sys.objects o
WHERE OBJECT_ID =FKC.referenced_object_id)
+ '] (['
+ (VÄLJ namn
FRÅN sys.columns c
WHERE c.OBJECT_ID =FKC.referenced_object_id
OCH c.column_id =FKC.referenced_column_id )
+ '])' AS CreateConstraintQuery

INTO #CreateConstraint
FRÅN sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC
PÅ FK.OBJECT_ID =FKC.constraint_object_id
INNER JOIN sys.objects o
PÅ FKC.parent_object_id =o.OBJECT_ID

-- Bygg Truncate Statement för alla tabeller och spara i #TempTruncateTables
VÄLJ 'Trunkera tabell ' + Schema_name(schema_id)
+ '.' + namn AS TruncateTableQuery

INTO #TempTruncateTables
FRÅN sys.tables
WHERE TYPE ='U'
OCH is_ms_shipped =0

GO


-- Drop Constraints
DEKLARERA @DropConstraintQuery SOM VARCHAR(4000)
DEKLARERA DropConstraintCur-MARKEREN FÖR
VÄLJ DropConstraintQuery
FRÅN #DropConstraint

ÖPPNA DropConstraintCur
HÄMTA Nästa FRÅN DropConstraintCur
INTO @DropConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@DropConstraintQuery
EXEC (@SQL)
SKRIV UT ' Query ::' + @DropConstraintQuery
+ 'Completed'
HÄMTA Nästa FRÅN DropConstraintCur INTO @DropConstraintQuery
AVSLUTA
STÄNG DropConstraintCur

DEALLOCATE DropConstraintCur
GO-- Trunkera tabeller

DECLARE @TempTruncateTablesCur AS VARCHAR(4000)
DEKLARE TempTruncateTablesCur CURSOR FÖR
VÄLJ TruncateTableQuery
FRÅN #TempTruncateTables

ÖPPNA TempTruncateTablesCur
HÄMTA Nästa FRÅN TempTruncateTablesCur
INTO @TempTruncateTablesCur
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL

SET @SQL=@TempTruncateTablesCur

EXEC (@SQL)

SKRIV UT ' Query ::' + @TempTruncateTablesCur
+ 'Completed'
HÄMTA Nästa FRÅN TempTruncateTablesCur INTO @TempTruncateTablesCur
END
STÄNG TempTruncateTablesCur

DEALLOCATE TempTruncateTablesCur
GO



-- Skapa begränsning efter trunkering
DECLARE @CreateConstraintQuery AS VARCHAR(4000)
DEKLARERA CreateConstraintQueryCur-MARKEREN FÖR
VÄLJ CreateConstraintQuery
FRÅN #CreateConstraint

ÖPPNA CreateConstraintQueryCur
HÄMTA Nästa FRÅN CreateConstraintQueryCur
INTO @CreateConstraintQuery
MED @@FETCH_STATUS =0
BÖRJA
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@CreateConstraintQuery
EXEC (@SQL)
SKRIV UT ' Query ::' + @CreateConstraintQuery
+ 'Completed'
HÄMTA Nästa FRÅN CreateConstraintQueryCur INTO @CreateConstraintQuery
AVSLUTA
STÄNG CreateConstraintQueryCur

DEALLOCATE CreateConstraintQueryCur

GO




Saker vi tog upp i detta inlägg
  • Hur man släpper en temptabell om den finns i SQL Server
  • Hur man använder systemtabeller för att få primärnyckel och främmande nyckelbegränsning
  • Hur man använder markörer i SQL Server
  • Hur man släpper främmande nyckelbegränsningar dynamiskt och återskapar dem
  • Hur man trunkerar alla tabeller i SQL Server Database
  • Hur man använder Dynamic SQL i TSQL
  • Hur man använder variabler i TSQL

  1. JSON_OBJECTAGG() Funktion i Oracle

  2. hämta ut parameter från lagrad procedur?

  3. Returnera 0 om fältet är null i MySQL

  4. Hur kontrollerar man resultatet av SSIS-paketjobbet efter att det har slutfört sin körning?