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

あなたは一貫したものを維持することにより、順序を使用して検討するかもしれません。

クラブカードから#tempcardにすべてのレコードを挿入できないと言っているなら、試してみて正しく動作します。 #tempcardには1020のレコードがあります。私はCTEの名前をEventsTop200に変更しなければならなかった。

更新日:質問が明らかになりました。

Clubcardにnullを設定できる場合、テンポラリテーブル#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

+0

私はあなたがしたいことや問題が何であるかをよく理解していませんでした。一度に200レコードを挿入するループが必要ですか?もしそうなら、クラブカードにIDフィールドはありますか? –

+0

@happysmile前のコメントを読んでください、私はあなたにタグを忘れました。 –

関連する問題