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ます。

レコードが 1020 の場合、1000 レコードのみが挿入され、残りの 20 レコードは挿入されていません。

問題の解決方法を教えてください。

4

1 に答える 1

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 の使用を検討するかもしれません。

Clubcard のすべてのレコードを #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 は、プロシージャがバッチで場所をコピーした後に挿入されたレコードを見逃すか、コピー後にレコードが削除される可能性があります。

于 2012-04-12T10:58:18.263 に答える