Quantcast
Channel: udayarumilli.com
Viewing all articles
Browse latest Browse all 145

How to Truncate only the Selected Tables from Database

$
0
0
We recently had a request for a script which should take the list of Table names as a parameter and all the givin tables should be truncated.


We came up with a stored procedure. Here we go.


--EXEC USP_Truncate_Tabs '''MEMBER_DIM'',''CLAIM_FACT'',''CLAIM_TYPE_DIM'',''POS_TYPE_DIM'''

CREATE PROC USP_Truncate_Tabs(@String VARCHAR(7500))
AS
BEGIN
SETNOCOUNTON

DECLARE @Constraints TABLE(ID INTIDENTITY,DropStmt VARCHAR(1000),CreateStmt VARCHAR(1000))
DECLARE @Tab TABLE(ID INTIDENTITY,TabName VARCHAR(200))
DECLARE @SQL1 VARCHAR(8000)
SET @SQL1='SELECT NAME FROM sysobjects  WHERE TYPE=''U'' AND name in('+(@String)+')'

/** Getting only selected tables details into @Tab **/
INSERTINTO @Tab EXEC(@SQL1)

/** Insert all Create and Drop Constraint Statements into a Temp Table *******/
INSERTINTO @Constraints (DropStmt,CreateStmt)
SELECT
  'ALTER TABLE ['+ ForeignKeys.ForeignTableSchema +
      '].['+ ForeignKeys.ForeignTableName +
      '] DROP CONSTRAINT ['+ ForeignKeys.ForeignKeyName +']; '
,'ALTER TABLE ['+ ForeignKeys.ForeignTableSchema +
      '].['+ ForeignKeys.ForeignTableName +
      '] WITH CHECK ADD CONSTRAINT ['+  ForeignKeys.ForeignKeyName +
      '] FOREIGN KEY(['+ ForeignKeys.ForeignTableColumn +
      ']) REFERENCES ['+schema_name(sys.objects.schema_id)+'].['+
  sys.objects.[name] +'](['+
  sys.columns.[name] +']);  '
 fromsys.objects
  innerjoinsys.columns
    on(sys.columns.[object_id] =sys.objects.[object_id])
  innerjoin(
    selectsys.foreign_keys.[name] as ForeignKeyName
     ,schema_name(sys.objects.schema_id)as ForeignTableSchema
     ,sys.objects.[name] as ForeignTableName
     ,sys.columns.[name]  as ForeignTableColumn
     ,sys.foreign_keys.referenced_object_id as referenced_object_id
     ,sys.foreign_key_columns.referenced_column_id as referenced_column_id
     fromsys.foreign_keys
      innerjoinsys.foreign_key_columns
        on(sys.foreign_key_columns.constraint_object_id
          =sys.foreign_keys.[object_id])
      innerjoinsys.objects
        on(sys.objects.[object_id]
          =sys.foreign_keys.parent_object_id)
        innerjoinsys.columns
          on(sys.columns.[object_id]
            =sys.objects.[object_id])
           and(sys.columns.column_id
            =sys.foreign_key_columns.parent_column_id)
    ) ForeignKeys
    on(ForeignKeys.referenced_object_id =sys.objects.[object_id])
     and(ForeignKeys.referenced_column_id =sys.columns.column_id)
 where(sys.objects.[type] ='U')
  and(sys.objects.[name] notin('sysdiagrams'))

/*** Drop all constraints in Database ****/
DECLARE @Sql VARCHAR(1000)
DECLARE @i INT,@Max INT
SELECT @Max=COUNT(1)FROM @Constraints
SET @i=1
WHILE(@i<=@Max)
BEGIN
SELECT @Sql=DropStmt FROM @Constraints WHERE ID=@i
EXEC(@Sql)
IF(@@ERROR<>0)
BEGIN
PRINT'Failed to Drop the Constraint : '+@Sql
END
SET @Sql=''
SET @i=@i+1
END
PRINT'All foreign keys are dropped successfully'

/*** Truncate selected Tables ****/

DECLARE @TabName VARCHAR(200)
SELECT @Max=COUNT(1)FROM @Tab
SET @i=1
WHILE(@i<=@Max)
BEGIN
SELECT @TabName=TabName FROM @Tab WHERE ID=@i
SELECT @Sql='TRUNCATE TABLE '+@TabName
EXEC(@Sql)
IF(@@ERROR<>0)
BEGIN
PRINT'Failed to Run the statement : '+@Sql
END
PRINT'Table '+@TabName+' Truncated'
SET @Sql=''
SET @i=@i+1
END

PRINT'All tables are truncated successfully'

/*** Recreate all constraints in Database ****/


SELECT @Max=COUNT(1)FROM @Constraints
SET @i=1
WHILE(@i<=@Max)
BEGIN
SELECT @Sql=CreateStmt FROM @Constraints WHERE ID=@i
EXEC(@Sql)
IF(@@ERROR<>0)
BEGIN
PRINT'Failed to Recreate the Constraint : '+@Sql
END
SET @Sql=''
SET @i=@i+1
END
PRINT'All foreign keys are recreated successfully'

END

/*** Execute SP to truncate the tables Emp, Dept, Emp_Add ***/
EXEC USP_Truncate_Tabs '''Dept'',''Emp'',''Emp_Add'''

 Output is like below






Viewing all articles
Browse latest Browse all 145

Trending Articles