In my Database I have a structure like:
I have prepared a dynamic store procedure to delete records from the DB but I am not getting the proper table order to delete records, That's why I am getting foreign key constraint error.
CREATE PROCEDURE [master].[DEL_RECORD_FRM_ALL_TABLE]
AS
DECLARE @V_TABLE_NAME VARCHAR(36)
DECLARE @V_FK_TABLE_NAME VARCHAR(36)
DECLARE @V_LEF_TABLE_NAME VARCHAR(36)
DECLARE CUR_FK CURSOR FOR
select a.name CHILD
from sysforeignkeys fk
join sys.objects a on a.object_id = fk.fkeyid
join sys.schemas b on a.schema_id=b.schema_id and b.name='MASTER'
where TYPE_DESC= 'USER_TABLE'
DECLARE CUR_ALL CURSOR FOR
SELECT A.NAME FROM sys.objects a
join sys.schemas b on a.schema_id=b.schema_id and b.name='MASTER'
where TYPE_DESC= 'USER_TABLE' and a.name not in(select a.name CHILD
from sysforeignkeys fk
join sys.objects a on a.object_id = fk.fkeyid
join sys.schemas b on a.schema_id=b.schema_id and b.name='MASTER'
where TYPE_DESC= 'USER_TABLE')
OPEN CUR_FK
FETCH NEXT FROM CUR_FK INTO @V_FK_TABLE_NAME
WHILE @@Fetch _STATUS = 0
BEGIN
DECLARE CUR_LEF CURSOR FOR
SELECT OBJECT_NAME(fk.parent_object_id)
FROM sys.tables t INNER JOIN sys.foreign_keys fk
ON t.object_id = fk.referenced_object_id
WHERE t.name = @V_FK_TABLE_NAME
DECLARE @COUNT_RECORDS INT=(SELECT COUNT(1)
FROM sys.tables t INNER JOIN sys.foreign_keys fk
ON t.object_id = fk.referenced_object_id
WHERE t.name = @V_FK_TABLE_NAME),
@COUNT INT=1
IF(@COUNT<=@COUNT_RECORDS)
BEGIN
OPEN CUR_LEF
FETCH NEXT FROM CUR_LEF INTO @V_LEF_TABLE_NAME
WHILE @@Fetch _STATUS = 0
BEGIN
DECLARE @LF NVARCHAR(50)
SET @LF = 'DELETE FROM MASTER.'+ @V_LEF_TABLE_NAME
EXECUTE sp_executesql @LF
FETCH NEXT FROM CUR_LEF INTO @V_LEF_TABLE_NAME
SET @COUNT= @COUNT+1
END
CLOSE CUR_LEF
DEALLOCATE CUR_LEF
END
ELSE
BEGIN
DECLARE @SQL NVARCHAR(50)
SET @SQL= 'DELETE FROM MASTER.'+@V_FK_TABLE_NAME
EXECUTE sp_executesql @SQL
FETCH NEXT FROM CUR_FK INTO @V_FK_TABLE_NAME
END
END
CLOSE CUR_FK
DEALLOCATE CUR_FK
OPEN CUR_ALL
FETCH NEXT FROM CUR_ALL INTO @V_TABLE_NAME
WHILE @@Fetch _STATUS = 0
BEGIN
DECLARE @all _TABLE NVARCHAR(50)
SET @all _TABLE= 'DELETE FROM MASTER.'+@V_TABLE_NAME
EXECUTE sp_executesql @all _TABLE
FETCH NEXT FROM CUR_ALL INTO @V_TABLE_NAME
END
DEALLOCATE CUR_ALL