Я хочу написать динамический скрипт, который удаляет дубликаты.Я хочу попытаться избежать CURSOR, поэтому я изучал написание строк, которые будут иметь таблицу в одном столбце и соответствующие атрибуты таблицы в другом.Я также пробовал динамический SQL с использованием WITH.Но это то, что я до сих пор.Это я намерен использовать в качестве параметров в динамическом SQL позже на примере
STUFF.Однако это приводит к повторению одинаковых имен столбцов для каждой строки:
select name as table_name,
stuff(( select ', ' +char(10)+ ac.[name] FROM DW.sys.columns ac
inner join DW.sys.tables t on ac.object_id=t.object_id
where ac.name not in ('ModifiedOn','ValidFrom','ValidTo')
FOR XML PATH('')
), 1, 1, '')
from sys.tables
Что мне нужно, так это вывод:
TableName || ColumnName
table1 || aa,ab,ac
table2 || ba,bb,bc
table3 || ca,cb,cc
Моя идея состоит в том, чтобы использовать это для этого или similair:
'WITH DELETEDUPLICATE AS (
SELECT '+@ColumnName+',
ROW_NUMBER() OVER(PARTITION BY '+@ColumnName+' ORDER BY '+@ColumnName+') AS Duplicate_Row_Count
FROM '+@TableName+'
)
DELETE
FROM DELETEDUPLICATE
WHERE Duplicate_Row_Count > 1
Любые идеи приветствуются!
ОБНОВЛЕНИЕ: С предложением satishcse я получаю желаемую таблицу.У меня была проблема с получением нескольких строк в динамическом шаге WITH, поэтому я просто удалил эту часть как переменную (убрал SET @WITH = ').Но как выполнить каждый ряд?что я получаю сейчас:
С DELETEDUPLICATE AS (....
Для каждой таблицы в строке