2017-03-07 17 views
-3
+-----+------------+-----------+-------+--------------+ 
| 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 

试过这个......但我对这个过程并不满意。这是相当容易的问题。它应该有简单的解决方案。

+0

才能添加预期的结果在这里 –

+2

嗯...你尝试过这么远吗?现在,您的问题基本上是“请为我写一些代码” - 而StackOverflow不是代码写入服务。因此,它可能会被封为“太广泛”。我建议你编辑你的问题,以显示你写的SQL,以及你遇到问题的地方。 –

+0

我用SP_PKEYS删除了cid,所以我只保留有冗余数据的列名。然后使用distinct并将表复制到另一个表。但我对此并不满意。这项行动似乎很昂贵。我尝试使用CTE,但我无法获得动态传递给分区的列名并按顺序排列。 –

回答

-1

试试这个

WHILE 1 = 1 
    BEGIN 
     DELETE FROM dbName..tblName 
     WHERE DateLogged IN (SELECT cid 
          FROM dbName..tblName WITH(NOLOCK) 
          GROUP BY cid 
          HAVING COUNT(*) > 1 
          ORDER BY cid) 
     IF @@Rowcount = 0 
     BREAK ; 
    END 
+0

我应该这样做,没有列名。 –

+0

使用复杂查询创建存储过程。使用参数来定义你的列 – Spythere

+0

@JGamis - 对我来说,你似乎只是试图为他们解决她的任务(根本没有代码显示)。并且这样做的方式违背了他们的任务。 –