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