この質問をしたことで、次のことを行うようになりました。
- SQLServer に渡すために、C# オブジェクト構造の XML 表現を作成します。
- XML をハッシュし、 XML を関連するテーブルに分割するストアド プロシージャを作成し、クイック ルックアップのためにハッシュをルート テーブルに格納します。
これは、複雑なオブジェクト データを SQLServer に渡し、XML を細断処理してテーブルと照合するのではなく、ハッシュでルックアップを実行できることを意味します (これも実行できますが、遅い(er))...
ただし、XML の優れた点の 1 つは、インデントなどの書式設定ができることです。また、属性の順序は重要ではありません。しかし、何かをハッシュするときは、フォーマットとインデントが重要です。だから私がC#でやっていることは...
- すべての属性をアルファベット順に並べて XML を正規化する
- .ToString(DisableFormatting) を使用して、余分なフォーマット スペースを削除します
これは問題なく動作しますが、テストするときは XML をフォーマットした方が簡単なので、ストアド プロシージャに渡す内容を簡単に確認できます。
属性の順序を保持するために SQLServer を信頼できればよいのですが、それはできません...
XML インスタンス内の属性の順序は保持されません。xml 型の列に格納されている XML インスタンスをクエリすると、結果の XML の属性の順序が元の XML インスタンスと異なる場合があります。
これは、SQLServer の XML データ型を使用してデータを正規化できないことを意味します。
私を悩ませているのは、ある時点で誰かが私のプロシージャを使用して、「ああ、XML、属性の順序は関係ない、フォーマットは関係ない、表現されるデータは同じだ」と考えるだろうということです。 tはそうなるでしょう。
この問題の解決策はありますか?T-SQL で XML パーサーを書きたくありません!! または、正規化するために他の誰かが作成した XML パーサーを使用します。SQLServer XML データ型が属性の順序を保持できないのはなぜですか?
アプリが常に同じ形式/順序で XML を渡すことを「信頼」できるため、同じオブジェクトに対して同じハッシュが得られると思います。しかし、これを行うには、ストアド プロシージャもアプリを「信頼」する必要があるという考えには不快です。どうにかして XML の正規化をチェックできるようにしたいのですが、明らかにそのように堅牢になります。