2012-04-12 10 views
0
CREATE TABLE #Tempcard 
      (
      Clubcard BIGINT NULL, 
     DateTime DATETIME NULL 
     ) 


    WHILE 1=1 
BEGIN 
     WITH EventsTop1000 
     AS 
     (
     SELECT top 200 Clubcard,DateTime 
     FROM Clubcard 
     WHERE(DATEDIFF(DAY ,Clubcard.DateTime ,getdate())>120)) 
     DELETE EventsTop200 
     OUTPUT DELETED.* 
     INTO #Tempcard; 
     IF (@@ROWCOUNT = 0) 
     BREAK; 
END 

Hier mache ich eine Batch-Insertion. Sobald ich die Datensätze in die #Tempcard Tabelle einfügen, möchte ich nicht die Daten aus der Tabelle Clubcard löschen, aber ich muss den nächsten Satz von Daten aus dem Clubcard holen und erneut die Daten in #Tempcard einfügen.einfügen Problem mit Batch weise in SQL-Server

Wenn meine Datensätze 1020 sind, kann ich sehen, dass nur 1000 Datensätze eingefügt werden, der Rest 20 wird nicht eingefügt.

Bitte lassen Sie mich wissen, wie Sie das Problem lösen können.

Antwort

1

Wenn ich richtig verstehe, wollen Sie Anzahl der Zeilen abzurunden bis 200:

insert into #Tempcard 
select top (select count(*)/200 * 200 from Clubcard) 
     Clubcard, 
     DateTime 
FROM Clubcard 
WHERE DATEDIFF(DAY, Clubcard.DateTime, getdate()) > 120 

Sie betrachten könnte durch einen Auftrag mit konsistenten Dinge zu halten.

Wenn Sie sagen, dass Sie nicht alle Datensätze von Clubcard in #tempcard einfügen können, habe ich es versucht und es funktioniert ordnungsgemäß. #tempcard hat 1020 Datensätze. Ich musste den CTE-Namen allerdings zu EventsTop200 ändern.

UPDATE: Frage geklärt.

Wenn Clubcard Nullen haben kann, fügen Sie der temporären Tabelle #Tempcard einen echten Primärschlüssel hinzu. Um Tabelle in Batch mit T-SQL-Code zu kopieren:

CREATE TABLE #Tempcard 
(
    Clubcard BIGINT NOT NULL PRIMARY KEY, 
    DateTime DATETIME NULL 
) 

declare @StartClubCard bigint 
set @StartClubCard = 0 

WHILE 1 = 1 
BEGIN 
    INSERT INTO #Tempcard 
    SELECT TOP 200 Clubcard, DateTime 
    FROM Clubcard 
    WHERE DATEDIFF(DAY, Clubcard.DateTime, getdate()) > 120 
     AND Clubcard > @StartClubCard 
    ORDER BY Clubcard 

    IF @@ROWCOUNT = 0 
     BREAK; 
    select @StartClubCard = max (Clubcard) 
    from #Tempcard 
END 

Es könnte Probleme geben. #Tempcard kann Datensätze vermissen, die nach dem Kopieren der Position in einen Stapel eingefügt wurden, oder Datensätze, die nach dem Kopieren gelöscht wurden.

+0

können Sie mir den gesamten Code geben, wie Sie das lösen – happysmile

+0

Ich habe nicht ganz verstanden, was Sie tun wollen und was das Problem ist. Möchten Sie eine Schleife, die 200 Datensätze gleichzeitig einfügt? Wenn ja, gibt es in der Clubcard ein ID-Feld? –

+0

@happysmile Bitte lesen Sie den vorherigen Kommentar, ich habe vergessen, Sie zu markieren. –