Tình huống:
Hãy nghĩ về cơ sở dữ liệu mà chúng tôi sử dụng cho quy trình ETL của mình và chúng tôi gọi đó là cơ sở dữ liệu. Chúng tôi muốn cắt bớt tất cả các bảng vào buổi sáng để chúng có thể được sử dụng cho quy trình hàng ngày. Một khi cách là viết câu lệnh Truncate cho mỗi bảng nhưng các bảng có thể bị xóa hoặc các bảng mới cũng có thể được tạo. Chúng tôi muốn viết một truy vấn mà chúng tôi có thể sử dụng để Cắt ngắn tất cả các bảng từ cơ sở dữ liệu và chúng tôi không phải viết lại các câu lệnh Cắt ngắn của mình.Nếu các bảng không có Khóa chính-Khóa thiết kế , chúng ta có thể sử dụng Truncate. Nhưng chúng ta thường có các bảng được tham chiếu bởi các bảng khác. Chúng ta không thể sử dụng câu lệnh Truncate cho các bảng đó. Cách duy nhất để Cắt ngắn các bảng đó là bỏ Ràng buộc khóa ngoại trước khi Cắt bỏ và sau đó Cắt ngắn và Tạo lại mối quan hệ sau đó.
Đoạn mã dưới đây có thể được sử dụng để Cắt ngắn tất cả các bảng từ cơ sở dữ liệu. Nếu các Bảng có mối quan hệ Pk-Fk, thì trước tiên tập lệnh sẽ loại bỏ các Ràng buộc Khoá ngoại, sau đó Cắt bỏ các bảng đó và cuối cùng tạo lại các ràng buộc Khoá ngoại.
Trước khi bạn chạy bên dưới Tập lệnh, hãy đảm bảo rằng bạn đang trỏ đến Cơ sở dữ liệu và Máy chủ chính xác! Tất cả những điều tốt nhất với việc Cắt bớt tất cả các bảng từ Cơ sở dữ liệu SQL Server.
-- 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 Server -
How to use system tables to get Primary key and foreign key Constraint -
How to use Cursors in SQL Server -
How to Drop Foreign Key Constraints dynamically and Recreate them -
How to Truncate all tables in SQL Server Database -
How to use Dynamic SQL in TSQL -
How to use Variables in TSQL