2017-05-24 5 views
0

Ich habe eine gespeicherte Prozedur, die jede Tabelle auf Duplikate überprüfen kann. Sie gibt eine Ergebnismenge mit allen doppelten Zeilen aus der angegebenen Tabelle zurück.Zählen doppelte Datensätze aus einer Tabelle mit gespeicherten Prozedur

Was ich jetzt möchte, ist die Anzahl der Duplikate zu zählen, erhalten Sie den Tabellennamen & Rundate Abfrage und fügen Sie es in eine Tabelle ein.

Das Problem, mit dem ich derzeit konfrontiert bin, ist, dass der SP einen Satz mit einer variablen Anzahl von Spalten zurückgibt. Daher kann ich das Ergebnis des SP nicht in ein vordefiniertes Testable einfügen.

Kennt jemand einen (klüger) Weg, dies zu tun?

Erwartetes Ergebnis

| Tabellenname | Datum | sumDupRows |

SP Ich verwende:

create proc [dbo].[sp_duplicates] @table nvarchar(50) as 

declare @query nvarchar(max) 
declare @groupby nvarchar(max) 

set @groupby = stuff((select ',' + name 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID(@table) 
       FOR xml path('')), 1, 1, '') 

set @query = 'select *, count(*) as duplicates 
       from '[email protected]+' 
       group by '[email protected]+' 
       having count(*) > 1' 

exec (@query) 
GO 
+0

Was meinst du MAXDATE? Wenn es Duplikate gibt, haben sie alle dasselbe Datum. Sie würden jede Spalte jeder duplizierten Zeile benötigen. – LoztInSpace

+0

Die Ergebnismenge in JSON oder XML umwandeln und speichern. –

+0

@lotzinspace, korrigiert; max date ist das Laufdatum (ein getdate() wird den Trick machen). – ppijnenburg

Antwort

0

Sie haben bereits festgestellt, doppelte Datensätze. Verwenden Sie eine andere select, um sie zu aggregieren.

create proc [dbo].[sp_duplicates] @table nvarchar(50) as 

declare @query nvarchar(max) 
declare @groupby nvarchar(max) 

set @groupby = stuff((select ',' + name 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID(@table) 
       FOR xml path('')), 1, 1, '') 

set @query = 'SELECT ' + 
       @table + ' AS tableName, 
       GETDATE() AS MaxDate, 
       SUM(duplicates) AS TotalDuplicates 
       FROM 
       (
       select count(*) as duplicates 
       from '[email protected]+' 
       group by '[email protected]+' 
       having count(*) > 1 
      ) A' 

exec (@query) 
GO 
+1

danke, ich dachte waaaaaay zu schwierig. – ppijnenburg

+0

die select @ Tabelle muss zwischen Anführungszeichen stehen (irgendwie kann ich sie nicht bearbeiten;) 'SELECT' '' + @table + '' 'wird den Trick machen – ppijnenburg

Verwandte Themen