私はSystem.OutOfMemoryExceptionで苦労しています。私はいくつかの解決策を見てきましたが、皆さんはもっと多くのRAMが必要だと言っています。それがコードの非効率性によるものなのかどうかは疑いがあります。
それぞれ約5kレコードの10個の異なるテーブルがあります。各テーブルから1つの列を選択して新しいテーブルを作成する必要があります.1.5kレコードを挿入できますが、実行停止は"System.OutOfMemoryException" 。 私のループはSystem.OutOfMemoryExceptionの原因となるストアドプロシージャでwhileループを使用していますか?
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
のように見えながら、私は質問がより汎用的にするために、サンプルコードを掲載しています。 ご意見やご提案は高く評価されます。
あなたは 'select @ var1 =(#ControlTableからトップ1のcol1を選択します); – artm
[Merge Statement](https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx)で簡単に実行できるこの作業を圧倒しているような気がします。また、 (#ControlTableから数を選択してください); ' –
Jorgeと合意 - (#ControlTableから数を選択してください);は別の*を生成する予定ですが、ループが繰り返されるたびに結果セット*が返されます。したがって、もしあなたが5000行について話しているなら、クライアントシステムが処理する5000個の結果セットを生成するでしょう。 –