Сценарий:
Нека помислим за база данни, която използваме за нашия ETL процес и наричаме тази база данни staging. Искаме да съкратим всички таблици сутрин, за да могат да се използват за ежедневния процес. Един път е да напишете нашия израз Truncate за всяка една от таблиците, но таблиците могат да бъдат изпуснати или също да бъдат създадени нови таблици. Искаме да напишем заявка, която можем да използваме за съкращаване на всички таблици от база данни и не е нужно да пренаписваме нашите изрази за срязване.Ако таблиците нямат първичен ключ - външен ключ връзка, можем да използваме Truncate. Но често имаме таблици, които са препратки от други таблици. Не можем да използваме израза Truncate за тези таблици. Единственият начин да съкратите тези таблици е да премахнете ограничението за външния ключ преди съкращаване и след това да съкратите и пресъздадете връзката след това.
Кодът по-долу може да се използва за съкращаване на всички таблици от базата данни. Ако таблиците ще имат отношението Pk-Fk, скриптът първо ще премахне ограниченията на външния ключ и след това ще съкрати тези таблици и накрая ще създаде отново ограниченията за външния ключ.
Преди да стартирате под скрипта, уверете се, че сте сочещи към правилната база данни и сървър! Всичко най-добро със съкращаване на всички таблици от база данни на SQL Server.
-- Изпускане на Temp Tables, ако съществува
АКО OBJECT_ID('tempdb..#DropConstraint') НЕ Е NULL
DROP TABLE #DropConstraint
АКО OBJECT_ID('tempdb..#CreateConstraint') НЕ Е NULL
DROP TABLE #CreateConstraint
АКО OBJECT_ID('tempdb..#TempTruncateTables') НЕ Е NULL
DROP TABLE #TempTruncateTables
код> -- Запазване на скрипт за ограничение в #DropConstraint Temp Table
ИЗБЕРЕТЕ 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' DROP CONSTRAINT ' + '[' + FK.name + ']' КАТО DropConstraintQuery
В #DropConstraint
ОТ sys.foreign_keys КАТО FK
INNER JOIN sys.foreign_key_columns КАТО FKC
ON FK.OBJECT_ID =FKC.constraint_object_id
INNER JOIN sys.objects O
ON O.OBJECT_ID =FKC.parent_object_id
код> -- Създаване на ограничителен скрипт Запазване в #CreateConstraint Temp Table
SELECT 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].' + '['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' ДОБАВЯНЕ НА ОГРАНИЧЕНИЕ ' + '[' + FK.name
+ '] Външен ключ (['
+ (ИЗБЕРЕТЕ име
ОТ sys.columns c
WHERE c.OBJECT_ID =FKC.parent_object_id
AND c.column_id =FKC.parent_column_id)
+ ']) ПРЕПОРЪЧКИ ' + '['
+ Schema_name(o.schema_id) + '].['
+ (ИЗБЕРЕТЕ име
ОТ sys.objects o
WHERE OBJECT_ID =FKC.referenced_object_id)
+ '] (['
+ (ИЗБЕРЕТЕ име
ОТ sys.columns c
КЪДЕ c.OBJECT_ID =FKC.referenced_object_id
AND c.column_id =FKC.referenced_column_id )
+ '])' AS CreateConstraintQuery
INTO #CreateConstraint
ОТ sys.foreign_keys КАТО FK
INNER JOIN sys.foreign_key_columns КАТО FKC
ON FK.OBJECT_ID =FKC.constraint_object_id
INNER JOIN sys.objects o
ON FKC.parent_object_id =o.OBJECT_ID
-- Създайте изявление за съкращаване за всички таблици и запазете в #TempTruncateTables
SELECT 'Отрязване на таблицата ' + Schema_name(schema_id)
+ '.' + име AS TruncateTableQuery
INTO #TempTruncateTables
ОТ sys.tables
КЪДЕТО TYPE ='U'
И is_ms_shipped =0
GO
код> -- Отпадане на ограничения
ДЕКЛАРИРАЙТЕ @DropConstraintQuery КАТО VARCHAR(4000)
ДЕКЛАРИРАЙТЕ DropConstraintCur КУРСОР ЗА
ИЗБЕРЕТЕ DropConstraintQuery
ОТ #DropConstraint
ОТВОРЕТЕ DropConstraintCur
ИЗВЛЕЧВАНЕ Следващото от DropConstraintCur
INTO @DropConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
ДЕКЛАРИРАНЕ @SQL VARCHAR(MAX)=NULL
SET @SQL=@DropConstraintQuery
EXEC (@SQL)
ПЕЧАТ ' Query ::' + @DropConstraintQuery
+ 'Completed'
ИЗВЛЕКАНЕ НА СЛЕДВАЩО ОТ DropConstraintCur В @DropConstraintQuery
КРАЙ
ЗАТВАРЯНЕ на DropConstraintCur
DEALLOCATE DropConstraintCur
GO-- Съкращаване на таблици
ДЕКЛАРИРАНЕ @TempTruncateTablesCur КАТО VARCHAR(4000)
ДЕКЛАРИРАЙТЕ TempTruncateTablesCur CURSOR ЗА
ИЗБЕРЕТЕ TruncateTableQuery
ОТ #TempTruncateTables
ОТВОРЕТЕ TempTruncateTablesCur
ИЗВЛЕЧИ Следващо от TempTruncateTablesCur
INTO @TempTruncateTablesCur
WHILE @@FETCH_STATUS =0
BEGIN
ДЕКЛАРИРАНЕ @SQL VARCHAR(MAX)=NULL
SET @SQL=@TempTruncateTablesCur
EXEC (@SQL)
PRINT ' Query ::' + @TempTruncateTablesCur
+ 'Completed'
ИЗВЛЕЧИ Следващо ОТ TempTruncateTablesCur В @TempTruncateTablesCur
END
ЗАТВОРИ TempTruncateTablesCur
ОТМЕНИ TempTruncateTablesCur
GO
код>
код> -- Създаване на ограничение след съкращаване
ДЕКЛАРИРАНЕ @CreateConstraintQuery КАТО VARCHAR(4000)
ДЕКЛАРИРАЙТЕ CreateConstraintQueryCur КУРСОР ЗА
ИЗБЕРЕТЕ CreateConstraintQuery
ОТ #CreateConstraint
ОТВОРЕТЕ CreateConstraintQueryCur
ИЗВЛЕЧВАНЕ Следващо ОТ CreateConstraintQueryCur
INTO @CreateConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
ДЕКЛАРИРАНЕ @SQL VARCHAR(MAX)=NULL
SET @SQL=@CreateConstraintQuery
EXEC (@SQL)
ОТПЕЧАТ ' Query ::' + @CreateConstraintQuery
+ 'Completed'
ИЗВЛЕЧИ СЛЕДВАЩО ОТ CreateConstraintQueryCur В @CreateConstraintQuery
КРАЙ
ЗАТВОРИ CreateConstraintQueryCur
ОТМЕНИ CreateConstraintQueryCur
GO
Неща, които разгледахме в тази публикация
Как да премахнете временна таблица, ако съществува в SQL Server
Как да използвате системни таблици, за да получите ограничение на първичен и външен ключ
Как да използвам курсори в SQL Server
Как да премахнете динамично ограниченията на външния ключ и да ги създадете отново
Как да съкратите всички таблици в базата данни на SQL Server
Как да използвам Dynamic SQL в TSQL
Как да използвам променливи в TSQL