Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Obetnij wszystkie tabele w bazie danych w SQL Server — SQL Server / TSQL Tutorial, część 55

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zrozumienie blokad SQL Server w zapytaniach SELECT

  2. Jak mogę porównać czas w SQL Server?

  3. Jak wyświetlić datę w amerykańskim formacie daty w programie SQL Server (T-SQL)

  4. Instrukcja SQL Server RAISERROR z prostymi przykładami

  5. Po co używać klauzuli INCLUDE podczas tworzenia indeksu?