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.
Vous voulez dire 'select @ var1 = (sélectionnez le top 1 col1 de #ControlTable);'? – artm
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);' –
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. –