Scenarie:
Lad os tænke på en database, som vi bruger til vores ETL-proces, og vi kalder den database-iscenesættelse. Vi ønsker at afkorte alle tabellerne om morgenen, så de kan bruges til den daglige proces. En gang måde er at skrive vores Truncate-sætning for hver af tabellerne, men tabeller kan droppes eller nye tabeller kan også oprettes. Vi ønsker at skrive en forespørgsel, som vi kan bruge til at afkorte alle tabeller fra en database, og vi behøver ikke at omskrive vores afkorte-sætninger.Hvis tabellerne ikke har Primary Key -Foreign Key forhold, kan vi bruge Truncate. Men vi har ofte tabeller, som andre tabeller refererer til. Vi kan ikke bruge Truncate-sætningen til disse tabeller. Den eneste måde at afkorte disse tabeller er at droppe Foreign Key Constraint før Truncating og derefter Truncate og Genskabe Relation efter det.
Nedenstående kode kan bruges til at Truncate alle tabellerne fra databasen. Hvis tabeller vil have Pk-Fk-relationen, vil scriptet først slippe fremmednøglebegrænsningerne og derefter trunkere disse tabeller og til sidst genskabe fremmednøglebegrænsningerne.
Før du kører under scriptet, skal du sørge for, at du er peger på korrekt database og server! Alt det bedste med at afkorte alle tabellerne fra en SQL Server-database.
-- Drop Temp-tabeller, hvis de findes
HVIS OBJECT_ID('tempdb..#DropConstraint') IKKE ER NULL
DROP TABEL #DropConstraint
HVIS OBJECT_ID('tempdb..#CreateConstraint') IKKE ER NULL
DROP TABEL #CreateConstraint
HVIS OBJECT_ID('tempdb..#TempTruncateTables') IKKE ER NULL
DROP TABLE #TempTruncateTables
-- Drop Constraint Script Gem i #DropConstraint Temp Tabel
VÆLG 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' DROP CONSTRAINT ' + '[' + FK.name + ']' AS DropConstraintQuery
INTO #DropConstraint
FRA 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
-- Opret begrænsningsscript Gem i #CreateConstraint Temp Tabel
VÆLG 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].' + '['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' ADD CONSTRAINT ' + '[' + FK.name
+ '] Fremmednøgle (['
+ (VÆLG navn
FRA sys.columns c
HVOR c.OBJECT_ID =FKC.parent_object_id
OG c.column_id =FKC.parent_column_id)
+ ']) REFERENCER ' + '['
+ Schema_name(o.schema_id) + '].['
+ (VÆLG navn
FRA sys.objects o
WHERE OBJECT_ID =FKC.referenced_object_id)
+ '] (['
+ (VÆLG navn
FRA sys.columns c
WHERE c.OBJECT_ID =FKC.referenced_object_id
OG c.column_id =FKC.referenced_column_id )
+ '])' AS CreateConstraintQuery
INTO #CreateConstraint
FRA 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
-- Byg Truncate Statement for alle tabellerne og gem i #TempTruncateTables
VÆLG 'Truncate table ' + Schema_name(schema_id)
+ '.' + navn AS TruncateTableQuery
INTO #TempTruncateTables
FRA sys.tables
WHERE TYPE ='U'
OG is_ms_shipped =0
GO
-- Drop Constraints
DEKLARE @DropConstraintQuery SOM VARCHAR(4000)
ERKLÆR DropConstraintCur CURSOR FOR
VÆLG DropConstraintQuery
FRA #DropConstraint
ÅBN DropConstraintCur
HENT Næste FRA DropConstraintCur
INTO @DropConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@DropConstraintQuery
EXEC (@SQL)
UDSKRIV ' Query ::' + @DropConstraintQuery
+ 'Completed'
HENT Næste FRA DropConstraintCur TIL @DropConstraintQuery
AFSLUT
LUK DropConstraintCur
DEALLOCATE DropConstraintCur
GO-- Afkort tabeller
DECLARE @TempTruncateTablesCur AS VARCHAR(4000)
ERKLÆR TempTruncateTablesCur CURSOR FOR
VÆLG TruncateTableQuery
FRA #TempTruncateTables
ÅBN TempTruncateTablesCur
FETCH Next FROM TempTruncateTablesCur
INTO @TempTruncateTablesCur
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@TempTruncateTablesCur
EXEC (@SQL)
UDSKRIV ' Query ::' + @TempTruncateTablesCur
+ 'Completed'
FETCH Next FROM TempTruncateTablesCur INTO @TempTruncateTablesCur
END
LUK TempTruncateTablesCur
DEALLOCATE TempTruncateTablesCur
GO
-- Opret begrænsning efter trunkering
DECLARE @CreateConstraintQuery AS VARCHAR(4000)
ERKLÆR CreateConstraintQueryCur-CURSOR FOR
VÆLG CreateConstraintQuery
FRA #CreateConstraint
ÅBN CreateConstraintQueryCur
HENT Næste FRA CreateConstraintQueryCur
INTO @CreateConstraintQuery
MENS @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@CreateConstraintQuery
EXEC (@SQL)
UDSKRIV ' Query ::' + @CreateConstraintQuery
+ 'Completed'
HENT Næste FRA CreateConstraintQueryCur INTO @CreateConstraintQuery
SLUT
LUK CreateConstraintQueryCur
DEALLOCATE CreateConstraintQueryCur
GO
Ting, vi dækkede i dette indlæg
Sådan droppes en midlertidig tabel, hvis den findes i SQL Server
Sådan bruger man systemtabeller til at få primærnøgle- og fremmednøglebegrænsning
Sådan bruger du markører i SQL Server
Sådan dropper du udenlandske nøglebegrænsninger dynamisk og genskaber dem
Sådan afkortes alle tabeller i SQL Server-databasen
Sådan bruger du dynamisk SQL i TSQL
Sådan bruges variabler i TSQL