SELECT distinct * from TableA INTO TableB;
truncate TableA;
insert into TableA select * from tableB;
drop tableB;
Дополнительные ответы из комментариев:
Создайте CTE (создайте это динамически, используя параметризованный SQL и информационную схему)
;WITH cteExample (val1, val2, RN) as
( select *, ROW_NUMBER() over (PARTITION by val1, val2 order by val1, val2) as RN from tableA)
-- select * from cteExample -- to verify results
delete from cteExample where RN > 1 -- to delete duplicate records
Используйте отлично, если вы знаете, что таблицы будут иметьпервичный ключ (как они должны)
;WITH cteExample as (select distinct * from TableA) delete a from cteExample b right join TableA a on b.primaryKey = a.PrimaryKey where b.PrimaryKey is null;
Наконец, полностью пропустите CTE, если хотите:
delete a from TableA a left join (select distinct * from TableA) b on a.PK = b.PK
where b.PK is null
Все эти операторы лучше всего обслуживать динамически с использованием хранимой процедурыили эквивалент exec sp_executeSQL (если есть), чтобы получить имена столбцов без предварительного знания столбцов.