परिदृश्य:
आइए एक डेटाबेस के बारे में सोचें जिसका उपयोग हम अपनी ETL प्रक्रिया के लिए करते हैं और हम उस डेटाबेस को स्टेजिंग कहते हैं। हम सुबह में सभी तालिकाओं को छोटा करना चाहते हैं ताकि उनका उपयोग दैनिक प्रक्रिया के लिए किया जा सके। एक बार तरीका यह है कि हम प्रत्येक तालिका के लिए अपना ट्रंकेट स्टेटमेंट लिखें, लेकिन टेबल को गिराया जा सकता है या नई टेबल भी बनाई जा सकती हैं। हम एक क्वेरी लिखना चाहते हैं जिसका उपयोग हम डेटाबेस से सभी तालिकाओं को छोटा करने के लिए कर सकते हैं और हमें अपने Truncate कथनों को फिर से लिखने की आवश्यकता नहीं है।यदि तालिकाओं में प्राथमिक कुंजी नहीं है - विदेशी कुंजी संबंध, हम ट्रंकेट का उपयोग कर सकते हैं। लेकिन हमारे पास अक्सर टेबल होते हैं जिन्हें अन्य तालिकाओं द्वारा संदर्भित किया जाता है। हम उन तालिकाओं के लिए Truncate कथन का उपयोग नहीं कर सकते हैं। उन तालिकाओं को छोटा करने का एकमात्र तरीका यह है कि ट्रंकेटिंग से पहले विदेशी कुंजी बाधा को छोड़ दें और उसके बाद संबंध को छोटा करें और फिर से बनाएं।
नीचे दिए गए कोड का उपयोग डेटाबेस से सभी तालिकाओं को छोटा करने के लिए किया जा सकता है। यदि टेबल्स में पीके-एफके संबंध होगा, तो स्क्रिप्ट पहले विदेशी कुंजी बाधाओं को छोड़ देगी और फिर उन तालिकाओं को छोटा कर देगी और अंत में विदेशी कुंजी बाधाओं को फिर से बनाएगी।
स्क्रिप्ट के नीचे चलाने से पहले, सुनिश्चित करें कि आप हैं डेटाबेस और सर्वर को सही करने की ओर इशारा करते हुए! SQL सर्वर डेटाबेस से सभी तालिकाओं को छोटा करने के साथ शुभकामनाएँ।
-- 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