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