Динамическое удаление на основе таблицы обновлений - PullRequest
0 голосов
/ 19 октября 2018

Я хочу написать динамический скрипт, который удаляет дубликаты.Я хочу попытаться избежать 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 (....

Для каждой таблицы в строке

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

попробуйте следующее для первой части:

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')
            and st.name = t.name
            order by 1
            FOR XML PATH('')
            ), 1, 1, '')
    from sys.tables st
0 голосов
/ 19 октября 2018

В OpenQuery вы должны выполнить запрос, используя функцию execute().Ответ может решить вашу проблему, но я не предлагаю вам использовать OpenQuery.

declare @query as nvarchar(max)

set
    @query = 
    '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'

execute(@query)
...