Sql 基于更新表的动态删除

Sql 基于更新表的动态删除,sql,sql-server,dynamicquery,Sql,Sql Server,Dynamicquery,我想写一个动态脚本来删除重复项。我想尽量避免使用游标,所以我一直在研究如何编写字符串,这些字符串将在一列中包含表,在另一列中包含相应的表属性。我还尝试了使用的动态SQL。但这就是我目前所拥有的。我打算稍后将其用作动态SQL中的参数 举个例子。但是,这会导致每行重复相同的列名: select name as table_name, stuff(( select ', ' +char(10)+ ac.[name] FROM DW.sys.columns ac in

我想写一个动态脚本来删除重复项。我想尽量避免使用游标,所以我一直在研究如何编写字符串,这些字符串将在一列中包含表,在另一列中包含相应的表属性。我还尝试了使用的动态SQL。但这就是我目前所拥有的。我打算稍后将其用作动态SQL中的参数

举个例子。但是,这会导致每行重复相同的列名:

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的建议下,我得到了我想要的桌子。我在使用步骤获取动态中的多行时遇到问题,所以我只是将该部分作为变量删除了“SET@with=”。但是如何执行每一行呢?我现在得到的是:

用DELETEDUPLICATE作为


对于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)

对于第一部分,请尝试以下操作:

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

我不想成为那个人。。。但是为什么不这样做一次,然后应用一个唯一的约束,这样就不再有重复项了呢?从根本上解决问题。我知道……如果我们可以,我们会的。你为什么不能?可以从中删除,但不能创建唯一约束?那么插入后触发器呢?为什么不建议使用OpenQuery?OpenQuery不是一个好的做法,因为,例如,调试问题,您无法使用执行计划,OpenQuery不接受变量作为其参数,查询可能会返回多个结果集,但OpenQuery只返回第一个结果集以及其他一些原因。当然,这就像连接表st和t一样简单。。谢谢现在我的问题是执行“WITH DELETEDUPLICATE AS…”之后得到的所有行。在第一步得到表之后,如何为@column_name和@tablename赋值…?我向表变量中插入一个值。在这里,我只使用该变量中的列,例如“++@TableVariable+”中的“+ColumnList+”bla bla,在上面的dynamic WITH query中。我在原始帖子中添加的方框/黄色方框上方的Se。为什么我要从字符串行或任何你们称之为它的地方执行它,是因为我想避免使用游标。;使用DELETEDUPLICATE作为SELECT ColumnName,行数按ColumnName过度划分按ColumnName排序按ColumnName作为重复行数从@tablename表中填充从DELETEDUPLICATE中删除其中重复行数>1将仅从临时表中删除条目…我不确定这是否是目标。不,结果代码,每行将为:删除重复为第1列、第2列、…,第1列、第2列的行数超过第1列、第2列、,。。。ORDER BY AS Duplicate_Row_Count FROM table A DELETE FROM DELETE Duplicate,其中Duplicate_Row_Count>1,然后对另一个表及其列集执行相同的操作。现在,如何执行行,最好不用光标。。