Szenario:
Denken wir an eine Datenbank, die wir für unseren ETL-Prozess verwenden, und wir nennen das Datenbank-Staging. Wir möchten morgens alle Tabellen abschneiden, damit diese für den täglichen Prozess verwendet werden können. Eine Möglichkeit besteht darin, unsere Truncate-Anweisung für jede Tabelle zu schreiben, aber Tabellen können auch gelöscht oder neue Tabellen erstellt werden. Wir möchten eine Abfrage schreiben, die wir verwenden können, um alle Tabellen aus einer Datenbank zu kürzen, und wir müssen unsere Truncate-Anweisungen nicht neu schreiben.Wenn die Tabellen keinen Primärschlüssel-Fremdschlüssel haben Beziehung können wir Truncate verwenden. Aber wir haben oft Tabellen, die von anderen Tabellen referenziert werden. Wir können die Truncate-Anweisung für diese Tabellen nicht verwenden. Die einzige Möglichkeit, diese Tabellen zu kürzen, besteht darin, die Fremdschlüsselbeschränkung vor dem Kürzen zu löschen und danach die Beziehung zu kürzen und neu zu erstellen.
Der folgende Code kann verwendet werden, um alle Tabellen aus der Datenbank zu kürzen. Wenn Tabellen die Pk-Fk-Beziehung haben, löscht das Skript zuerst die Foreign Key Constraints und schneidet dann diese Tabellen ab und erstellt schließlich die Foreign Key Constraints neu.
Bevor Sie das Skript ausführen, stellen Sie sicher, dass Sie es sind zeigt auf richtige Datenbank und Server! Alles Gute beim Abschneiden aller Tabellen aus einer SQL Server-Datenbank.
-- Drop Temp Tables if Exists IF OBJECT_ID('tempdb..#DropConstraint') IS NOT NULL
DROP TABLE #DropConstraint IF OBJECT_ID('tempdb..#CreateConstraint') IS NOT NULL
DROP TABLE #CreateConstraint IF OBJECT_ID('tempdb..#TempTruncateTables') IS NOT NULL
DROP TABLE #TempTruncateTables
-- Drop Constraint Script Save in #DropConstraint Temp Table SELECT 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' DROP CONSTRAINT ' + '[' + FK.name + ']' AS DropConstraintQuery INTO #DropConstraint FROM sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC
ON FK.OBJECT_ID = FKC.constraint_object_id
INNER JOIN sys.objects O
ON O.OBJECT_ID = FKC.parent_object_id
-- Create Constraint Script Save in #CreateConstraint Temp Table SELECT 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].' + '['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' ADD CONSTRAINT ' + '[' + FK.name
+ '] Foreign Key (['
+ (SELECT name
FROM sys.columns c
WHERE c.OBJECT_ID = FKC.parent_object_id
AND c.column_id = FKC.parent_column_id)
+ ']) REFERENCES ' + '['
+ Schema_name(o.schema_id) + '].['
+ (SELECT name
FROM sys.objects o
WHERE OBJECT_ID = FKC.referenced_object_id)
+ '] (['
+ (SELECT name
FROM sys.columns c
WHERE c.OBJECT_ID = FKC.referenced_object_id
AND c.column_id = FKC.referenced_column_id)
+ '])' AS CreateConstraintQuery INTO #CreateConstraint FROM sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC
ON FK.OBJECT_ID = FKC.constraint_object_id
INNER JOIN sys.objects o
ON FKC.parent_object_id = o.OBJECT_ID
-- Build Truncate Statement for all the tables and save into #TempTruncateTables SELECT 'Truncate table ' + Schema_name(schema_id)
+ '.' + name AS TruncateTableQuery INTO #TempTruncateTables FROM sys.tables WHERE TYPE = 'U'
AND is_ms_shipped = 0
GO
-- Drop Constraints DECLARE @DropConstraintQuery AS VARCHAR(4000) DECLARE DropConstraintCur CURSOR FOR
SELECT DropConstraintQuery
FROM #DropConstraint OPEN DropConstraintCur FETCH Next FROM DropConstraintCur INTO @DropConstraintQuery WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@DropConstraintQuery
EXEC (@SQL)
PRINT ' Query ::' + @DropConstraintQuery
+ 'Completed'
FETCH Next FROM DropConstraintCur INTO @DropConstraintQuery
END
CLOSE DropConstraintCur DEALLOCATE DropConstraintCur
GO-- Truncate tables DECLARE @TempTruncateTablesCur AS VARCHAR(4000) DECLARE TempTruncateTablesCur CURSOR FOR
SELECT TruncateTableQuery
FROM #TempTruncateTables OPEN TempTruncateTablesCur FETCH Next FROM TempTruncateTablesCur INTO @TempTruncateTablesCur WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@TempTruncateTablesCur
EXEC (@SQL)
PRINT ' Query ::' + @TempTruncateTablesCur
+ 'Completed'
FETCH Next FROM TempTruncateTablesCur INTO @TempTruncateTablesCur
END
CLOSE TempTruncateTablesCur DEALLOCATE TempTruncateTablesCur
GO
-- Create Constraint After Truncate DECLARE @CreateConstraintQuery AS VARCHAR(4000) DECLARE CreateConstraintQueryCur CURSOR FOR
SELECT CreateConstraintQuery
FROM #CreateConstraint OPEN CreateConstraintQueryCur FETCH Next FROM CreateConstraintQueryCur INTO @CreateConstraintQuery WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@CreateConstraintQuery
EXEC (@SQL)
PRINT ' Query ::' + @CreateConstraintQuery
+ 'Completed'
FETCH Next FROM CreateConstraintQueryCur INTO @CreateConstraintQuery
END
CLOSE CreateConstraintQueryCur DEALLOCATE CreateConstraintQueryCur
GO Things we covered in this Post How to drop temp table if exists in SQL ServerHow to use system tables to get Primary key and foreign key ConstraintHow to use Cursors in SQL ServerHow to Drop Foreign Key Constraints dynamically and Recreate themHow to Truncate all tables in SQL Server DatabaseHow to use Dynamic SQL in TSQLHow to use Variables in TSQL