SQL Server 2008 では、XML パーサーがクラッシュする前に、単一の XML ノードが持つことができる属性の最大数に関して壁にぶつかりました。
表示されるエラーは次のとおりです。
Msg 6303, Level 16, State 1, Line 1
XML parsing: Document parsing required too much memory
これは少し誤解を招きます。文字列を XML データ型 (またはテーブル列) に変換するときに問題が発生します。
SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>')
XXXXXは、実際には別の 8191 属性です。
合計で、データセットには最初から 10,066 の属性が含まれていました。属性の数を 8,192 まで減らすと、問題なく動作します。ただし、8,193 個の属性がクラッシュします。
データのサイズとは特に関係がないようです (100MB か 60KB かは関係ありません - 属性カウントに基づいて同じ失敗/成功が得られます)。
では、この制限を変更するために SQL サーバーでできることはありますか?
私たちの C# アプリケーションにはこの制限がないため、C# の完全に有効な XML ドキュメントを SQL サーバーの XML データ列に格納することはできません。
誰でも提供できるヘルプは大歓迎です。数百のコンポーネントを含むアプリケーション フレームワーク全体のデータ処理機能を書き直す必要があるため、この時点でデータ構造を変更することはできません。
PS: アプリケーションがデータをツリーとしてではなく、単一ノードの属性として保存する状況がいかにばかげているかについて、私はすでに管理者にアドバイスしましたが、これは私が取り組まなければならないことです :-(
編集: 2 GB RAM のサーバーと 32 GB RAM のサーバー上の SQL Server 2008 32 および 64 ビット バージョンでこれを試しました。すべてのバージョンと環境で同じ問題が発生します。
アップデート:
SQL Server 2012 でこれを試しましたが、8,193 個の属性があり、文字列の長さも指定されたサイズ (テスト文字列の長さは 833K) を超えている場合は失敗しますが、同じ長さの文字列にのみある場合は機能します8,192 の属性。
ただし、12,000 の属性を持つはるかに短い文字列 (193K) があり、SQL Server 2012 および SQL Server 2008 で動作します)
したがって、キャストされる文字列が特定のサイズを超えると、属性の数の組み合わせのように見えます。これはもっと面白くなります!
これまでのフィードバックに感謝します!
更新 2:
より小さな文字列 (270K) でさらにテストした後、16,384 の属性制限にまだ達しています... 16,385 属性は失敗します! というわけで、文字列の長さの組み合わせ次第で8K属性単位で確実に発生!!