sql >> Database teknologi >  >> RDS >> Sqlserver

Afkort alle tabellerne i en database i SQL Server - SQL Server / TSQL Tutorial Del 55

Scenarie:

Lad os tænke på en database, som vi bruger til vores ETL-proces, og vi kalder den database-iscenesættelse. Vi ønsker at afkorte alle tabellerne om morgenen, så de kan bruges til den daglige proces. En gang måde er at skrive vores Truncate-sætning for hver af tabellerne, men tabeller kan droppes eller nye tabeller kan også oprettes. Vi ønsker at skrive en forespørgsel, som vi kan bruge til at afkorte alle tabeller fra en database, og vi behøver ikke at omskrive vores afkorte-sætninger.

Hvis tabellerne ikke har Primary Key -Foreign Key forhold, kan vi bruge Truncate. Men vi har ofte tabeller, som andre tabeller refererer til. Vi kan ikke bruge Truncate-sætningen til disse tabeller. Den eneste måde at afkorte disse tabeller er at droppe Foreign Key Constraint før Truncating og derefter Truncate og Genskabe Relation efter det.

Nedenstående kode kan bruges til at Truncate alle tabellerne fra databasen. Hvis tabeller vil have Pk-Fk-relationen, vil scriptet først slippe fremmednøglebegrænsningerne og derefter trunkere disse tabeller og til sidst genskabe fremmednøglebegrænsningerne.

Før du kører under scriptet, skal du sørge for, at du er peger på korrekt database og server! Alt det bedste med at afkorte alle tabellerne fra en SQL Server-database.


-- Drop Temp-tabeller, hvis de findes
HVIS OBJECT_ID('tempdb..#DropConstraint') IKKE ER NULL
DROP TABEL #DropConstraint

HVIS OBJECT_ID('tempdb..#CreateConstraint') IKKE ER NULL
DROP TABEL #CreateConstraint

HVIS OBJECT_ID('tempdb..#TempTruncateTables') IKKE ER NULL
DROP TABLE #TempTruncateTables


-- Drop Constraint Script Gem i #DropConstraint Temp Tabel
VÆLG 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' DROP CONSTRAINT ' + '[' + FK.name + ']' AS DropConstraintQuery

INTO #DropConstraint
FRA sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC
PÅ FK.OBJECT_ID =FKC.constraint_object_id
INNER JOIN sys.objects O
ON O.OBJECT_ID =FKC.parent_object_id


-- Opret begrænsningsscript Gem i #CreateConstraint Temp Tabel
VÆLG 'ALTER TABLE ' + '['
+ Schema_name(o.schema_id) + '].' + '['
+ OBJECT_NAME(FK.parent_object_id) + ']'
+ ' ADD CONSTRAINT ' + '[' + FK.name
+ '] Fremmednøgle (['
+ (VÆLG navn
FRA sys.columns c
HVOR c.OBJECT_ID =FKC.parent_object_id
OG c.column_id =FKC.parent_column_id)
+ ']) REFERENCER ' + '['
+ Schema_name(o.schema_id) + '].['
+ (VÆLG navn
FRA sys.objects o
WHERE OBJECT_ID =FKC.referenced_object_id)
+ '] (['
+ (VÆLG navn
FRA sys.columns c
WHERE c.OBJECT_ID =FKC.referenced_object_id
OG c.column_id =FKC.referenced_column_id )
+ '])' AS CreateConstraintQuery

INTO #CreateConstraint
FRA sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC
PÅ FK.OBJECT_ID =FKC.constraint_object_id
INNER JOIN sys.objects o
PÅ FKC.parent_object_id =o.OBJECT_ID

-- Byg Truncate Statement for alle tabellerne og gem i #TempTruncateTables
VÆLG 'Truncate table ' + Schema_name(schema_id)
+ '.' + navn AS TruncateTableQuery

INTO #TempTruncateTables
FRA sys.tables
WHERE TYPE ='U'
OG is_ms_shipped =0

GO


-- Drop Constraints
DEKLARE @DropConstraintQuery SOM VARCHAR(4000)
ERKLÆR DropConstraintCur CURSOR FOR
VÆLG DropConstraintQuery
FRA #DropConstraint

ÅBN DropConstraintCur
HENT Næste FRA DropConstraintCur
INTO @DropConstraintQuery
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@DropConstraintQuery
EXEC (@SQL)
UDSKRIV ' Query ::' + @DropConstraintQuery
+ 'Completed'
HENT Næste FRA DropConstraintCur TIL @DropConstraintQuery
AFSLUT
LUK DropConstraintCur

DEALLOCATE DropConstraintCur
GO-- Afkort tabeller

DECLARE @TempTruncateTablesCur AS VARCHAR(4000)
ERKLÆR TempTruncateTablesCur CURSOR FOR
VÆLG TruncateTableQuery
FRA #TempTruncateTables

ÅBN TempTruncateTablesCur
FETCH Next FROM TempTruncateTablesCur
INTO @TempTruncateTablesCur
WHILE @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL

SET @SQL=@TempTruncateTablesCur

EXEC (@SQL)

UDSKRIV ' Query ::' + @TempTruncateTablesCur
+ 'Completed'
FETCH Next FROM TempTruncateTablesCur INTO @TempTruncateTablesCur
END
LUK TempTruncateTablesCur

DEALLOCATE TempTruncateTablesCur
GO



-- Opret begrænsning efter trunkering
DECLARE @CreateConstraintQuery AS VARCHAR(4000)
ERKLÆR CreateConstraintQueryCur-CURSOR FOR
VÆLG CreateConstraintQuery
FRA #CreateConstraint

ÅBN CreateConstraintQueryCur
HENT Næste FRA CreateConstraintQueryCur
INTO @CreateConstraintQuery
MENS @@FETCH_STATUS =0
BEGIN
DECLARE @SQL VARCHAR(MAX)=NULL
SET @SQL=@CreateConstraintQuery
EXEC (@SQL)
UDSKRIV ' Query ::' + @CreateConstraintQuery
+ 'Completed'
HENT Næste FRA CreateConstraintQueryCur INTO @CreateConstraintQuery
SLUT
LUK CreateConstraintQueryCur

DEALLOCATE CreateConstraintQueryCur

GO




Ting, vi dækkede i dette indlæg
  • Sådan droppes en midlertidig tabel, hvis den findes i SQL Server
  • Sådan bruger man systemtabeller til at få primærnøgle- og fremmednøglebegrænsning
  • Sådan bruger du markører i SQL Server
  • Sådan dropper du udenlandske nøglebegrænsninger dynamisk og genskaber dem
  • Sådan afkortes alle tabeller i SQL Server-databasen
  • Sådan bruger du dynamisk SQL i TSQL
  • Sådan bruges variabler i TSQL

  1. Oracle identitet kolonne og indsæt i vælg

  2. Forespørgsel om at beregne både kumulativ og samlet SUM over løn

  3. SQL Server UNION - Hvad er standard ORDER BY Behavior

  4. Begræns en SQL Server-forbindelse til en specifik IP-adresse