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 可以有空值,则将真正的主键添加到临时表 #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 回答