SharePoint Online のAPI を通してドキュメントライブラリやリストのデータを取得する時に注意するべき点があります。それはレコードを取得できる件数に上限があることで、5000件以上のデータを取得しようとするとエラーが発生します。この問題は「SharePointリストの5000件問題」として知られています。
実際にドライバで5000件以上のレコードがあるドキュメントライブラリを取得しようとすると「この操作は、リストビューのしきい値を超えているため、実行できません。」というエラーが発生します。本記事ではこのエラーを回避するための方法と制限について説明します。
解決方法の概要
SOAPスキーマ、RESTスキーマで解決方法が異なります。それぞれ以下の設定でこのエラーを回避できます。
- SOAP スキーマ:フィルタ条件(WHERE 句)に「FullClientFilter = True」を指定します。
- REST スキーマ:接続プロパティのDisableFilterLimit にtrue を設定します。
しかし、この機能は一部フィルタ条件との併用が制限されています。以下、SOAPスキーマとRESTスキーマで具体的な使用例を説明します。
SOAPスキーマ
SOAP スキーマでのドキュメントライブラリとリストについてそれぞれ解決方法を説明します。
ドキュメントライブラリ
ドキュメントライブラリに5000件以上のレコードが存在する状態でレコードを取得しようとするとエラーが発生します。
-- NG
SELECT * FROM ドキュメント;
解決方法
クエリのWHERE 句に以下の条件を指定します。
FullClientFilter=True
-- OK
SELECT * FROM ドキュメント WHERE FullClientFilter = true;
以下のように他のフィルタ条件と併用することもできます。
--OK
SELECT * FROM ドキュメント 登録者 = 'Test Taro' AND WHERE FullClientFilter = true;
リスト
リストは他にフィルタ条件を指定しなければFullClientFilter を指定しなくても5000件以上のレコードを取得できます。
-- OK
SELECT * FROM MyList;
しかし、レコードが5000件以上で、かつID 以外のカラムをWHERE 句に指定するとエラーが発生します。
-- NG
SELECT * FROM MyList WHERE 登録者 = 'Test Taro';
ID カラムをWHERE 句に指定した場合は正常にレコードを取得できます。
-- OK
SELECT * FROM MyList WHERE ID = 3;
解決方法
クエリのWHERE 句に以下の条件を指定します。
SELECT * FROM MyList WHERE 登録者 = 'Test Taro' AND FullClientFilter = true;
上記のクエリを実行するとドライバは全レコードを取得し、条件「登録者 = 'Test Taro'」がローカルで処理されます。
REST スキーマ
REST スキーマでは5000件以上のドキュメントライブラリやリストに対し、WHERE 句でフィルタ条件を指定しなければ全てのレコードを取得することができます。しかしフィルタ条件を指定してデータを絞り込むことができません。そのためREST スキーマで大量にデータからフィルタ条件を指定してレコードを取り出す場合は最後に載せた運用による回避策を検討してください。
5000件以上のレコードが存在するドキュメントライブラリまたはリストからレコードを取得すると、エラーは発生しませんがデータが取得できません。一見レコードが取得できているように見えますがほとんどのカラムの値が空になります。
-- NG (No error occurs, but data cannot be retrieved)
SELECT * FROM ドキュメント;
解決方法
接続プロパティのDisableFilterLimit にtrue を設定します。この接続でWHERE 句を指定せずにレコードを取得すると正常にデータが取得できます。
-- OK
SELECT * FROM ドキュメント;
しかし、以下のようにID 以外のカラムをWHERE 句を指定すると「この操作は、リストビューのしきい値を超えているため、実行できません。」というエラーが発生します。
-- NG
SELECT * FROM ドキュメント WHERE AuthorId = 11;
IDカラムをWHERE句に指定するとエラーは発生しませんがデータが取得できません。
-- NG (No error occurs, but data cannot be retrieved)
SELECT * FROM ドキュメント WHERE ID = 3;
運用による解決方法
最後に運用による解決方法を示します。
5000件ずつ取得 (SOAP のみ)
以下のようにId 列を5000件ずつシフトしながら取得することで、合計5000件以上のデータの取得が可能です。
SELECT * FROM TableWithManyRecords where SubFolder='Folder1' and (Id between 1 and 5000) and Column1 = 'Test1';
SELECT * FROM TableWithManyRecords where SubFolder='Folder1' and (Id between 5001 and 10000) and Column1 = 'Test1'
SELECT * FROM TableWithManyRecords where SubFolder='Folder1' and (Id between 10001 and 15000) and Column1 = 'Test1';
・・・
別DBにコピー (SOAP またはREST)
SharePoint から全データをMySQL などのDB に格納し、そのDB に対してクエリを発行する方法です。RESTスキーマでフィルタリングを実行したい場合はこちらの方法をお勧めします。
関連コンテンツ