2012-04-14 47 views
-3

可能重複:
Query not working fine in while loopWHILE循環問題在SQL Server不工作2005

我有一個WHILE的循環,我想插入

DECLARE @CurrentOffer int =121 
DECLARE @OldestOffer int = 115 

WHILE 1 = 1 
BEGIN 
    INSERT INTO Temp WITH (TABLOCK) 
     SELECT TOP (100) clubcard 
     FROM TempClub WITH (NOLOCK) 
     WHERE ID BETWEEN @MinClubcardand AND @MaxClubcard 

    declare @sql varchar(8000) 

    while @OldestOffer <= @CurrentOffer 
    begin 
      print @CurrentOffer 
      print @OldestOffer 

      set @sql = 'delete from Temp where Clubcard 
         in (select Clubcard 
          from ClubTransaction_' + convert(varchar, @CurrentOffer) + 
        ' with (nolock))' 

      print (@sql) 
      exec (@sql) 

      SET @CurrentOffer = @CurrentOffer-1 

      IF @OldestOffer = @CurrentOffer 
      begin 
      -- my logic 
      end 
    end 
END 

我我在這裏做的是我按行批量插入表Temp並檢查是否存在表ClubTransaction_121

如果它退出,我需要在這裏刪除我的循環得到第一個100會員卡,然後用ClubTransaction_121檢查,並移動到檢查下一個報價是120

但我的表Temp有3000行這需要用表ClubTransaction_121檢查所有行。

只爲前100條記錄檢查和移動檢查與下一ClubTransaction_120,請幫我在這

我需要檢查我所有的會員卡所有3000行與ClubTransaction_121ClubTransaction_120ClubTransaction_119

所有行

對此的任何幫助將是偉大的

+1

哇,有一些薄弱的數據庫設計怎麼回事。 – 2012-04-14 15:35:49

+0

是的,你可能會考慮嘗試關係數據設計。 – RBarryYoung 2012-04-14 15:37:16

回答

0

首先,我會建議擺脫TABLOCK和NOLOCK,因爲它們可能導致不一致的數據。

接下來通過你的循環的每次迭代,我會開始事務和提交事務,假設每個步驟可以被認爲是好的,如果它完成,並且如果10個循環完成,並且第11個失敗,那麼可以不回滾整個交易。

是這樣的:

DECLARE @CurrentOffer int =121 
DECLARE @OldestOffer int = 115 

WHILE 1 = 1 
BEGIN 
    BEGIN TRANSACTION; 
    INSERT INTO Temp 
     SELECT TOP (100) clubcard 
     FROM TempClub 
     WHERE ID BETWEEN @MinClubcardand AND @MaxClubcard 

    declare @sql varchar(8000) 

    while @OldestOffer <= @CurrentOffer 
    begin 
      print @CurrentOffer 
      print @OldestOffer 

      set @sql = 'delete from Temp where Clubcard 
         in (select Clubcard 
          from ClubTransaction_' + convert(varchar, @CurrentOffer) 

      print (@sql) 
      exec (@sql) 

      SET @CurrentOffer = @CurrentOffer-1 

      IF @OldestOffer = @CurrentOffer 
      begin 
      -- my logic 
      end 
    end 
    COMMIT TRANSACTION; 
END