2

私は、CTE を利用して有効な SQL を構築する、長々としたクエリ システムを作成しています。単純なシステムでも1000個もの表現ができる可能性があり、将来的に限界に達してシステムを作り直さなければならないのではないかと心配しています。

高低を検索しましたが、答えが見つかりません。私が知りたい
のは、CTE で許可される式の最大数はいくつですか?

注:再帰は使用していません。

私の最善の推測は、バッチごとに許可される文字数によって制限されていることです ( SQL Server クエリの最大サイズを参照してください? IN 句? より良いアプローチはありますか? )

編集

以下のテストコード。私の開発マシンは奇妙に正確に 600 で停止しました。

DECLARE @i int = 1,  @q varchar(max);

SET @q = 'WITH[0]AS(SELECT 1 AS c)'

WHILE @i < 600
BEGIN
    SET @q = @q + ',[' + CONVERT(varchar, @i) + ']AS(SELECT * FROM[' + CONVERT(varchar, @i-1) + '])';
    SET @i = @i + 1;
END;

SET @q = @q + 'SELECT * FROM[' + CONVERT(varchar, @i-1) + ']';

EXEC (@q);

これを実稼働サーバーでテストする方法については後で説明しますが、それにはしばらく時間がかかります。

4

1 に答える 1

2

バッチ内で定義できる非再帰 CTE の数に直接的な上限はないようです。利用可能なリソースおよびその他の該当する制限によってのみ制限されるべきです。

私はしばらく調査しましたが、これが私が見つけた質問に対する唯一の直接的な答えです。

ただし、 SQL サーバーの最大値の MSDN リストまたは CTE のドキュメントには、CTEの最大数についての言及はありません。

質問のコメントで言及されているマーティンのテストは、制限エラーではなくメモリ不足エラーが発生したため、これに特定の制限がないことを示唆しています。を使用しているため、テストが正確に600で停止したことはまったく奇妙ではないと思いますWHILE @i < 600。制限を上げてみて、何が起こるか見てみましょう。

于 2012-06-28T15:46:39.620 に答える