2012-04-12 65 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 

在這裏我正在做一個批量插入。一旦我將記錄插入到#Tempcard表中,我不想從表Clubcard中刪除數據,但我需要從Clubcard中提取下一組數據,並再次將數據插入#Tempcard在sql server中使用批處理插入問題

如果我的記錄是1020,我可以看到只有1000條記錄被插入,其餘20條沒有被插入。

請讓我知道如何解決這個問題。

回答

1

如果我理解正確的,你要舍行數到200:

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

你可能會考慮使用ORDER BY來保持一致性。

如果您在說不能將所有記錄從會員卡插入到#tempcard中,我已經嘗試過了,它能正常工作。 #tempcard有1020條記錄。我不得不改變CTE名稱到EventsTop200。

更新:問題澄清。

如果會員卡可以有空值,將真正的主鍵添加到臨時表#Tempcard。 要使用T-SQL代碼批量複製表:

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 

可能有問題。 #Tempcard可能會遺漏在程序在批處理中複製其位置後插入的記錄,或者複製後可能會刪除記錄。

+0

你可以給我整個代碼如何解決這個 – happysmile 2012-04-12 11:27:18

+0

我不完全明白你想要做什麼,問題是什麼。你想要一個循環,一次插入200條記錄嗎?如果是這樣,Clubcard中是否有ID字段? – 2012-04-12 11:30:19

+0

@happysmile請閱讀之前的評論,我忘記標記你。 – 2012-04-12 11:51:25