1

J'ai lutté avec System.OutOfMemoryException. J'ai vu une solution mais tous disent que vous avez besoin de plus de RAM. Je doute que ce soit dû à l'inefficacité du code. Alors laissez-moi partager mon problème.
J'ai 10 tables différentes avec environ 5k enregistrements dans chaque, je dois sélectionner une colonne de chaque table et construire une nouvelle table.Je suis capable d'insérer environ 1.5k enregistrements mais l'exécution s'arrête avec "System.OutOfMemoryException" . Ma boucle while ressembleL'utilisation de la boucle while dans la procédure stockée provoque-t-elle System.OutOfMemoryException?

ALTER PROCEDURE Sp_sample 
As 
    Select col1 
    into 
    #ControlTable 
    from 
    tab1 

while exists(select * from #ControlTable) 
    begin 

      (select count(*) from #ControlTable); 
      select @var1 = (select top 1 col1 from #ControlTable);   
      select @var2 = (select top 1 col2 from table1 where [email protected]); 
      if exists (select a from tablenew where [email protected]) 
      begin    
       update tablenew set col2 = @var2 where col1 = @var1 
      end 
      else 
      begin   
       insert into tablenew values (@var1,@var2) 
      end 
      delete from #ControlTable where col1 = @var1; 
    end 
Begin 

J'ai posté exemple de code pour faire question plus générique. Toute aide ou suggestion sera grandement appréciée.

+0

Vous voulez dire 'select @ var1 = (sélectionnez le top 1 col1 de #ControlTable);'? – artm

+1

Je me sens comme vous maîtrisez cette tâche qui serait facilement fait avec un [Merge Statement] (https://technet.microsoft.com/en-us/library/bb522522 (v = sql.105) .aspx) En outre, il y a des parties qui ne valent rien comme '(select count (*) from #ControlTable);' –

+1

D'accord avec Jorge - que '(select count (*) from #ControlTable);' va générer un séparé * jeu de résultats * à chaque fois que la boucle se répète. Donc, si vous parlez de 5000 lignes, vous générerez 5000 ensembles de résultats pour le système client. –

Répondre

3

S'il vous plaît essayer ci-dessous en boucle et vérifier les performances:

ALTER PROCEDURE Sp_sample 
As 
Select col1, ROW_NUMBER() OVER(Order By col1) AS RowNo 
into 
#ControlTable 
from 
tab1 

DECLARE @Index INT=1; 
DECLARE @TotalRow INT=0; 

SELECT @TotalRow=COUNT(col1) FROM #ControlTable 

while @Index<[email protected] 
begin    
     select @var1 = var1 from #ControlTable where [email protected];   
     select @var2 = var2 from table1 where [email protected]; 

     if exists (select a from tablenew where [email protected]) 
     begin    
      update tablenew set col2 = @var2 where col1 = @var1 
     end 
     else 
     begin   
      insert into tablenew values (@var1,@var2) 
     end 
     SET @Index = @Index+1; 
end 
Begin 
+0

Merci @Sandip. ça a marché pour moi. – Hitsa00

1

Vous pouvez utiliser MERGE pour insérer ou d'une table de mise à jour.

Select col1, max(col2) AS col2 into #ControlTable from tab1 GROUP BY col1 

MERGE tablenew AS T 
USING #ControlTable AS S 
ON (T.col1 = S.col1) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(col1, col2) VALUES(S.col1, S.col2) 
WHEN MATCHED 
    THEN UPDATE SET T.col2 = S.col2