Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Съкратете всички таблици в база данни в SQL Server - SQL Server / TSQL урок, част 55

Сценарий:

Нека помислим за база данни, която използваме за нашия 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предимства на производителността на SQL Server 2016 Enterprise Edition

  2. Как да добавите файлова група към база данни на SQL Server (T-SQL)

  3. Каква е разликата между CHAR и VARCHAR в SQL Server - SQL Server / T-SQL урок, част 31

  4. Групи за наличност на SQL Server AlwaysOn:Инсталация и конфигурация, част 2

  5. Сигнали за агент на SQL Server