Loading

getDescribe() を使用したときに「System UnexpectedException」エラーが発生する

公開日: May 17, 2026
説明
問題
  • お客様がクエリの際に Opportunity の getDescribe を使用しています。
  • 予期しない例外が発生します。クエリで選択している項目数が多すぎるか、フィルタ条件が複雑すぎます。
  • ワークベンチで直接クエリを実行しても、例外は発生しません。

再現するための手順:

1. 開発者コンソールに移動し、次のスニペットを実行します。
 
Opportunity Opp;
String eventQuery=null;
List<String> eventFields=new List<String>();
eventFields.addAll(Opportunity.getSObjectType().getDescribe().fields.getMap().keyset());
eventQuery='select '+eventFields.get(0);
for(integer i=1;i<eventFields.size();i++){
eventQuery+=','+eventFields.get(i);
}
eventQuery+=' from Opportunity where id=\'006L00000030dw8\'';
Opp=Database.query(eventQuery);

2. 次のエラーが発生します。

15:52:40.201 (201678000)|EXCEPTION_THROWN|[10]|System.UnexpectedException: Query is either selecting too many fields or the filter conditions are too complicated.
15:52:40.201 (201948000)|FATAL_ERROR|System.UnexpectedException: Query is either selecting too many fields or the filter conditions are too complicated.

3. しかし、上記のクエリをワークベンチで実行しても、例外は発生しません。結果は出力されます。
解決策
これは設計通りに動作していますが、生成された SQL の構築と最適化はコンテキスト (Apex および API) に応じて異なります。この違いにより、Apex では SQL の上限である 64K に達してしまいますが、API では 57K となりません。

ここでの解決策は、クエリを分割することです (または、取得する列を減らし、本当に必要なものだけを取得することは、常にベストプラクティスです)。ユーザは、describe を介して X 個の項目で分割し、結果のリストを 1 つに戻すといったことができるでしょう。これは、SOQL の最大値を増やすよりも、よりスケーラブルになるでしょう。

注: SOQL の長さは 20K までとしていますが、実際の制限は SQL の 64K です。
ナレッジ記事番号

000386129

 
読み込み中
Salesforce Help | Article