Remover registros duplicados no SQL Server

Hoje precisei remover os registros duplicados em uma tabela no SQL Server então resvovi criar um script que realiza esse procedimento

--Remove a tabela se já existir
IF OBJECT_ID('tempdb..#WorkflowDuplicatedTemp') IS NOT NULL
	DROP TABLE #WorkflowDuplicatedTemp

--Busca todos os registros que estão pulicados e armazena em uma tabela temporária
SELECT WorkflowID, EntityKeyValue
INTO #WorkflowDuplicatedTemp
FROM workflows.task_timed_triggers 
WHERE Status='W'
GROUP  BY WorkflowID, EntityKeyValue HAVING COUNT(1) > 1

DECLARE @KeyValue UNIQUEIDENTIFIER
DECLARE @WorkflowID INT
DECLARE @WorkflowTimedTriggerID INT

WHILE EXISTS (SELECT 1 FROM #WorkflowDuplicatedTemp)
BEGIN

	--busca o registro aguardando o processamento
	SELECT TOP 1 @KeyValue = EntityKeyValue, @WorkflowID = WorkflowID
	FROM #WorkflowDuplicatedTemp

	-------------------------------------------------------------------------------
	-- verificar se tem um registro com lock date (em processamento)
	-- deverá manter esse registro, se não houver deverá manter o registro 
	-- aguardando processamento (lock date is null)

	IF EXISTS(	SELECT 1
				FROM workflows.task_timed_triggers
				WHERE WorkflowID = @WorkflowID
				AND LockDate IS NOT NULL
				AND EntityKeyValue = @KeyValue
				AND Status = 'W'
	)
		SELECT TOP 1 @WorkflowTimedTriggerID = WorkflowTimedTriggerID
		FROM workflows.task_timed_triggers
		WHERE WorkflowID = @WorkflowID
		AND LockDate IS NOT NULL
		AND EntityKeyValue = @KeyValue
		AND Status = 'W'
    
	ELSE
		SELECT TOP 1 @WorkflowTimedTriggerID = WorkflowTimedTriggerID
		FROM workflows.task_timed_triggers
		WHERE WorkflowID = @WorkflowID
		AND LockDate IS NULL
		AND EntityKeyValue = @KeyValue
		AND Status = 'W'
	--END 

	-- Deleta os registros duplicados, mantendo um registro aguardando processamento
	DELETE FROM workflows.task_timed_triggers 
	WHERE EntityKeyValue=@KeyValue 
	AND Status='W' 
	AND WorkflowID=@WorkflowID 
	AND WorkflowTimedTriggerID != @WorkflowTimedTriggerID

	-- Deleta o registro da tabela temporaria
	DELETE FROM #WorkflowDuplicatedTemp
	WHERE WorkflowID = @WorkflowID 
	AND EntityKeyValue = @KeyValue
END

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *