我想编写一个删除重复项的动态脚本。我想尝试避免使用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(....
每行每张表
答案 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