De vez en cuando aparecen registros dobles en la tabla por error en el codigo
o por duplicación de datos en los distintos recursos de información del sistema,
y en este caso debemos eliminar los registros superfluos para que quede una
sola.
En el pasado eso fue demasiado complicado (suponemos que no hay ninguna
diferencia entre los registros duplicados, y no existe columna de numeros
automaticos o Clave Primaria): crear una tabla temporal, pasar los registros
usando el operador Distinct, eliminar los registros de la tabla original, copiar
los registros de vuelta de la tabla temporal al original, y finalmente- eliminar
la temporal..
Hoy es mucho mas simple- creamos una tabla para la demostración:
Create Table #Tmp(name VarChar(Max),
object_id Int,
schema_id Int,
type_desc VarChar(100));
Agregaremos la tabla de sistema sys.objects cinco veces a la nueva tabla,
usando una patente útil:
Insert Into #Tmp
Select name,
object_id,
schema_id,
type_desc
From sys.objects;
Go 5
Se puede ver facilmente que cada registro aparece ahora cinco veces en la
tabla:

Select *
From #Tmp
Order By object_id;
Creamos un CTE para enumerar los registros dobles, y eleminaremos los
superfluos – con numeros iguales o mas grandes que 2:
With T As
(Select Row_Number() Over (Partition By name,object_id,schema_id,type_desc Order By name) Num
From #Tmp)
Delete
From T
Where Num>=2;
verificaremos que no quedaron registros dobles:
Select name,object_id,schema_id,type_desc
From #Tmp
Group By name,object_id,schema_id,type_desc
Having Count(*)>1;
Comentario: en el CTE hay que incluir en la lista del Partition By todas las
columnas de la tabla, dado que en la tabla no existe una Clave Primaria;
Y en el "Order By" Alguna de la las columnas, no importa cual.