+-----+------------+-----------+-------+--------------+
| cid | LastName | FirstName | City | customerType |
+-----+------------+-----------+-------+--------------+
| 1 | joshi | ram | ktm | 1 |
| 2 | sundar | shayam | ktm | 0 |
| 3 | Probert | Asia | ltp | 1 |
| 4 | Pepper | Carmela | bkt | 0 |
| 5 | Grantham | Odell | klnk | 1 |
| 6 | Granillo | Agustina | patan | 1 |
| 7 | Moczygemba | Phyllis | bkt | 2 |
| 8 | Moczygemba | Phyllis | bkt | 2 |
| 9 | sundar | shayam | ktm | 0 |
| 10 | bilas | gita | ktm | 5 |
| 11 | sas | ram | ktm | 2 |
+-----+------------+-----------+-------+--------------+
我想要所有非冗余数据。但只需通过传递存储过程的表名 ,以便我可以将sp重用于其他任何表。如何通过指定表名来创建存储过程从sql server db删除冗余行?
ALTER Procedure [dbo].[deleteDupTables] @TABLENAME varchar(100)
AS
Begin
DECLARE @order varchar(1000)
DECLARE @columns varchar(1000)
SELECT @order = QUOTENAME(column_name), @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TABLENAME AND COLUMN_NAME not in (Select
kcu.COLUMN_NAME
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
where
tc.CONSTRAINT_TYPE = 'PRIMARY KEY' and
tc.TABLE_SCHEMA = 'dbo' and
tc.TABLE_NAME = @TABLENAME)
ORDER BY ORDINAL_POSITION
Declare @Delete varchar(2000)
Set @Delete = 'WITH q AS (Select ' + @columns + ', ROW_NUMBER() OVER (PARTITION BY ' + @columns + ' ORDER BY ' + @order + ') AS rn FROM ' + @TABLENAME + ') DELETE FROM q WHERE rn > 1 ;';
exec (@delete)
End
试过这个......但我对这个过程并不满意。这是相当容易的问题。它应该有简单的解决方案。
才能添加预期的结果在这里 –
嗯...你尝试过这么远吗?现在,您的问题基本上是“请为我写一些代码” - 而StackOverflow不是代码写入服务。因此,它可能会被封为“太广泛”。我建议你编辑你的问题,以显示你写的SQL,以及你遇到问题的地方。 –
我用SP_PKEYS删除了cid,所以我只保留有冗余数据的列名。然后使用distinct并将表复制到另一个表。但我对此并不满意。这项行动似乎很昂贵。我尝试使用CTE,但我无法获得动态传递给分区的列名并按顺序排列。 –