Scenariusz:
Pomyślmy o bazie danych, której używamy w naszym procesie ETL i nazywamy ją stagingiem bazy danych. Chcemy rano obciąć wszystkie tabele, aby można je było wykorzystać w codziennym procesie. Jednym ze sposobów jest napisanie naszej instrukcji Truncate dla każdej tabeli, ale tabele można usuwać lub można również tworzyć nowe tabele. Chcemy napisać zapytanie, którego możemy użyć do Obcięcia wszystkich tabel z bazy danych i nie musimy przepisywać naszych instrukcji Obtnij.Jeśli tabele nie mają klucza podstawowego - klucza obcego relacji, możemy użyć Obcinania. Ale często mamy tabele, do których odwołują się inne tabele. Nie możemy użyć instrukcji Truncate dla tych tabel. Jedynym sposobem na obcięcie tych tabel jest usunięcie ograniczenia klucza obcego przed obcięciem, a następnie obcięcie i ponowne utworzenie relacji.
Poniższy kod może zostać użyty do obcięcia wszystkich tabel z bazy danych. Jeśli tabele będą miały relację Pk-Fk, skrypt najpierw usunie ograniczenia klucza obcego, a następnie przytnie te tabele, a na końcu odtworzy ograniczenia klucza obcego.
Zanim uruchomisz poniżej skryptu, upewnij się, że wskazując na poprawną bazę danych i serwer! Najlepsze z obcinania wszystkich tabel z bazy danych SQL Server.
-- Usuń tabele tymczasowe, jeśli istnieje
IF OBJECT_ID('tempdb..#DropConstraint') NIE JEST NULL
DROP TABLE #DropConstraint
IF OBJECT_ID('tempdb..#CreateConstraint') NIE JEST NULL
DROP TABLE #CreateConstraint
JEŚLI OBJECT_ID('tempdb..#TempTruncateTables') NIE JEST NULL
DROP TABLE #TempTruncateTables
-- Upuść skrypt ograniczający Zapisz w #DropConstraint Temp Table
SELECT 'ALTER TABLE ' + '['
+ Nazwa_schematu(o.schema_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' DROP CONSTRAINT ' + '[' + FK.name + ']' AS DropConstraintQuery
DO #DropConstraint
Z sys.foreign_keys JAKO FK
ZŁĄCZENIE WEWNĘTRZNE sys.foreign_key_columns JAKO FKC
NA FK.OBJECT_ID =FKC.constraint_object_id
ZŁĄCZENIE WEWNĘTRZNE sys.objects O
ON O.OBJECT_ID =FKC.parent_object_id
-- Utwórz skrypt ograniczający Zapisz w tabeli temp #CreateConstraint
SELECT 'ALTER TABLE ' + '['
+ Nazwa_schematu(o.schema_id) + '].' + '['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ 'DODAJ OGRANICZENIE ' + '[' + FK.name
+ '] Klucz obcy (['
+ (SELECT nazwa
FROM sys.columns c
WHERE c.OBJECT_ID =FKC.parent_object_id
AND c.column_id =FKC.parent_column_id)
+ ']) REFERENCES ' + '['
+ Nazwa_schematu(o.schema_id) + '].['
+ (SELECT nazwa
FROM sys.objects o
WHERE OBJECT_ID =FKC.referenced_object_id)
+ '] (['
+ (SELECT nazwa
FROM sys.columns c
WHERE c.OBJECT_ID =FKC.referenced_object_id
AND c.column_id =FKC.referenced_column_id )
+ '])' AS CreateConstraintQuery
DO #CreateConstraint
Z sys.foreign_keys JAKO FK
ZŁĄCZENIE WEWNĘTRZNE sys.foreign_key_columns JAKO FKC
NA FK.OBJECT_ID =FKC.constraint_object_id
ZŁĄCZENIE WEWNĘTRZNE sys.objects o
ON FKC.parent_object_id =o.OBJECT_ID
-- Zbuduj instrukcję Truncate dla wszystkich tabel i zapisz w #TempTruncateTables
SELECT 'Obetnij tabelę ' + Schema_name(schema_id)
+ '.' + nazwa AS TruncateTableQuery
INTO #TempTruncateTables
Z sys.tables
WHERE TYPE ='U'
AND is_ms_shipped =0
GO
-- Usuń ograniczenia
DECLARE @DropConstraintQuery AS VARCHAR(4000)
ZADEKLARUJ DropConstraintCur KURSOR DLA
WYBIERZ DropConstraintQuery
Z #DropConstraint
OTWÓRZ DropConstraintCur
FETCH Next FROM DropConstraintCur
DO @DropConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@DropConstraintQuery
EXEC (@SQL)
PRINT 'Zapytanie ::' + @DropConstraintQuery
+ 'Zakończono'
FETCH Next FROM DropConstraintCur INTO @DropConstraintQuery
END
ZAMKNIJ DropConstraintCur
DEALLOCATE DropConstraintCur
GO-- Obcinanie tabel
DECLARE @TempTruncateTablesCur AS VARCHAR(4000)
DECLARE TempTruncateTablesCur KURSOR 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 ' Zapytanie ::' + @TempTruncateTablesCur
+ 'Zakończono'
FETCH Next FROM TempTruncateTablesCur INTO @TempTruncateTablesCur
END
ZAMKNIJ TempTruncateTablesCur
DEALOKUJ TempTruncateTablesCur
GO
-- Utwórz wiązanie po przycięciu
DECLARE @CreateConstraintQuery AS VARCHAR(4000)
DECLARE CreateConstraintQueryCur KURSOR FOR
SELECT CreateConstraintQuery
FROM #CreateConstraint
OTWÓRZ CreateConstraintQueryCur
FETCH Next FROM CreateConstraintQueryCur
INTO @CreateConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@CreateConstraintQuery
EXEC (@SQL)
PRINT ' Zapytanie ::' + @CreateConstraintQuery
+ 'Zakończono'
FETCH Next FROM CreateConstraintQueryCur INTO @CreateConstraintQuery
END
ZAMKNIJ CreateConstraintQueryCur
DEALOKUJ CreateConstraintQueryCur
GO
Rzeczy, które omówiliśmy w tym poście
Jak usunąć tabelę tymczasową, jeśli istnieje w SQL Server
Jak używać tabel systemowych, aby uzyskać klucz podstawowy i ograniczenie klucza obcego
Jak używać kursorów w SQL Server
Jak dynamicznie usuwać ograniczenia klucza obcego i tworzyć je ponownie
Jak przyciąć wszystkie tabele w bazie danych SQL Server
Jak używać dynamicznego SQL w TSQL
Jak używać zmiennych w TSQL