[SharePoint][ドキュメントライブラリ]SPWeb.GetSiteData(SPSiteDataQuery)使えないじゃん!
のエントリの続きです。
残念ながら、SPList.GetItems(SPQuery)メソッドでもマッチするアイテム数が約2100件越えると
System.Data.SqlClient.SqlException: 着信の表形式のデータ ストリーム (TDS) リモート プロシージャ コール (RPC) プロトコル ストリームが不適切です。この RPC 要求に指定されたパラメータが多すぎます。最大数は 2100 です。
という例外が起きました!
そればかりか通常のWebのUI画面においても・・・
リスト(同一フォルダ内)にアクセス権のあるアイテムが約2100件以上ある時にアクセス権を持っているユーザでその一覧を表示しようとすると・・・
<!-- #RENDER FAILED -->
のように表示され、一覧が出てこないことがあります。
これに関してのMSサポートオンラインのKBがあります。
Error message when you visit a sub-folder under a Windows SharePoint Services 3.0 list that contains more than 2,000 list items that have non-inheriting permissions: ”#RENDER FAILED”
(機械翻訳:継承している以外のアクセス許可を持つ 2,000 以上のリスト アイテムを含む Windows SharePoint Services 3.0 のリストをサブフォルダにアクセスすると、エラー メッセージ:”#RENDER に失敗しました”)
WSS3.0のバグということですね。
修正プログラム(kb957691)
957691 (http://support.microsoft.com/kb/957691/ ) Description of the Windows SharePoint Services 3.0 hotfix package (Sts.msp): October 28, 2008
(957691 (http://support.microsoft.com/kb/957691/ ) Windows SharePoint Services 3.0 修正プログラム パッケージ (Sts.msp): 2008 年 10 月 28 日)
がでているのですね。ところそのリンクの下に
Note After you apply this hotfix, you may still receive the error message that is mentioned in the "Symptoms" section. This may be caused by a query that is too long and that has a large number of non-inheriting permissions. In this case, you have to reduce the number of non-inheriting permissions. If you use 5,000 or more non-inheriting permissions in the list, you may encounter this problem.
注意してください。 この修正プログラムを適用した後も、「現象」に記載されているエラー メッセージが表示されます可能性があります。 考えられますが長すぎると多数のクエリによって継承以外のアクセス許可。 継承している以外の数を減らすにあるこの場合、アクセス許可。 一覧で 5,000 またはより以外の継承アクセス許可を使用する場合この問題が発生する可能性があります。
とあります。
すなわち、KB957691の修正プログラムあててもアイテム数の上限が2000件から5000件になるだけ!?
CAMLクエリを使用するAPIを使わないで、SPListItemCollectionとSPListItemを使用するべたなループで条件判断して該当アイテムを取得するか、クエリのWhere句を2000件超えないように調節して複数回実行するぐらいかしかないのでしょうか。それとも別の方法があるのでしょうか?
以下2/17追記:
残念ながら、アイテム数が約2100件超えている場合SPListItemCollectionのメソッドやメンバも同様の例外になります。SPListItemCollection.Count プロパティでさえも同様の例外となってしまいます!