Dynamic Query For Truncate Tables when it has Foreign key relationships


Set NoCount on
Declare @FK_Table Varchar(100)
Declare @PK_Table Varchar(100)
Declare @FK_Constraint Varchar(100)
Declare @FK_Cnt int
Declare @FK_Columns Varchar(max)
Declare @PK_Columns Varchar(max)
Declare @Query varchar(max)
Declare @FK_Cursor Cursor

Select * Into Test_FroeignKey From
(Select
Name As Constraint_Name,OBJECT_NAME(A.parent_object_id) Foreign_Table,
OBJECT_NAME(A.referenced_object_id ) Primary_Table,
COL_NAME (B.parent_object_id,parent_column_id ) As Foreign_Key,
COL_NAME(B.referenced_object_id ,referenced_column_id) As Primary_Key
From sys.foreign_keys A Inner join sys.foreign_key_columns B
On A.object_id =B.constraint_object_id   where A.name Like'%ConstraintName%'
)AA

Set @FK_Cursor = Cursor For Select Distinct Constraint_Name From Test_FroeignKey
Open @FK_Cursor
Fetch Next From @FK_Cursor Into @FK_Constraint
 --Drop the foreign keys
 While @@FETCH_STATUS =0
 Begin
 
   Select @FK_Table= Max(Foreign_Table) From Test_FroeignKey
   Where Constraint_Name in(
                            Select Distinct Constraint_Name
                            From
                                (Select  Name As Constraint_Name
                                 From sys.foreign_keys  A
                                 Inner join sys.foreign_key_columns  B
                                 On A.object_id =B.constraint_object_id
                                 Where A.name Like'%ConstraintName%'
                                 )AA
                             ) And Constraint_Name =@FK_Constraint
   Set @Query = 'Alter Table Test.dbo.'+@FK_Table+' Drop '+ @FK_Constraint
   Exec (@Query)
 
 Fetch Next From @FK_Cursor Into @FK_Constraint
 End

Close @FK_Cursor

---Truncate Tables-------
Truncate Table Test.dbo.Tablename

Open @FK_Cursor
Fetch Next From @FK_Cursor Into @FK_Constraint

 While @@FETCH_STATUS =0
 Begin

 Select @FK_Cnt=COUNT(*)  From Test_FroeignKey  Where Constraint_Name =@FK_Constraint
 If @FK_Cnt =1
   Begin
   Select
       @FK_Table= Foreign_Table,@FK_Columns=Foreign_Key,
       @PK_Table = Primary_Table,@PK_Columns =Primary_Key
   From Test_FroeignKey
   Where Constraint_Name Not In(
  Select Distinct Constraint_Name
  From (
Select  Name As Constraint_Name
From sys.foreign_keys  A
Inner join sys.foreign_key_columns  B
On A.object_id = B.constraint_object_id
Where A.name Like'%ConstraintName%'
)AA
                               ) And Constraint_Name = @FK_Constraint
                             
   Set @Query = 'Alter Table Test.dbo.'+ @FK_Table +
                ' ADD  CONSTRAINT '+ @FK_Constraint+' FOREIGN KEY('+ @FK_Columns +
                ')REFERENCES Test.dbo.'+@PK_Table+'('+ @PK_Columns +')'
 
   Exec (@Query)
   End
 
   Else
   Begin

Set @FK_Columns = Stuff((Select ', ' + Convert(Varchar(100),Foreign_Key)
    From
  (Select Foreign_Key From Test_FroeignKey
   Where Constraint_Name =@FK_Constraint
  )X
    FOR XML PATH('')
    ),1,2,'')
                         
   Set @PK_Columns = Stuff((Select ', ' + Convert(Varchar(100),Primary_Key)
                            From
                              (Select Primary_Key From Test_FroeignKey
                               Where Constraint_Name =@FK_Constraint
                              )X
                            FOR XML PATH('')
                            ),1,2,'')                        


   Select
       @FK_Table = Max(Foreign_Table),
       @PK_Table = Max(Primary_Table)
   From Test_FroeignKey
   Where Constraint_Name Not In(
  Select Distinct Constraint_Name
  From (
Select  Name As Constraint_Name
From sys.foreign_keys  A
Inner join sys.foreign_key_columns  B
On A.object_id = B.constraint_object_id
Where A.name Like'%ConstraintName%'
)AA
                               ) And Constraint_Name = @FK_Constraint
     
   Set @Query = 'Alter Table Test.dbo.'+ @FK_Table +
                ' ADD  CONSTRAINT '+ @FK_Constraint+' FOREIGN KEY('+ @FK_Columns +
                ')REFERENCES Test.dbo.'+@PK_Table+'('+ @PK_Columns +')'
 
   Exec (@Query)
   End

 Fetch Next From @FK_Cursor Into @FK_Constraint
 End
Close @FK_Cursor
Deallocate  @FK_Cursor
Drop Table Test_FroeignKey

No comments:

Post a Comment