根据更新表动态删除

时间:2018-10-19 16:39:32

标签: sql sql-server dynamicquery

我想编写一个删除重复项的动态脚本。我想尝试避免使用CURSOR,所以我一直在研究编写字符串,而不是将字符串放在一列中,而将相应的表格属性放在另一列中。我也尝试过使用WITH进行动态SQL。但是,这就是我到目前为止所拥有的。我打算稍后在

中将其用作动态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   

我的想法是使用此效果或类似效果:

'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 :(得分:1)

在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)

答案 1 :(得分:1)

在第一部分尝试以下操作:

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