次の方法で共有


hierarchyid データ型メソッド リファレンス

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

hierarchyid データ型は可変長のシステム データ型です。 hierarchyid は、階層内の位置を表すために使用します。 hierarchyid 型の列は、ツリーを自動的に表すわけではありません。 行間の目的のリレーションシップが値に反映されるように 、hierarchyid 値を生成して割り当てるのはアプリケーションの役割です。

値、 hierarchyid データ型は、ツリー階層内の位置を表します。 値を hierarchyid 、次のプロパティがあります。

  • 極めてコンパクト: n 個のノードを持つツリー内のノードを表すために必要な平均ビット数は、平均ファンアウト (ノードの平均子数) によって異なります。 小さなファンアウト (0 から 7) の場合、サイズは約 6 * logA n ビットで、A は平均ファンアウトです。 6 つのレベルの平均ファンアウトを持つ 100,000 人の組織階層のノードには、約 38 ビットかかります。 格納時には、これが 40 ビット (5 バイト) に切り上げられます。

  • 比較は深さ優先順です。aの 2 つの b 値を指定すると、a<bはツリーの深さ優先トラバーサルで a が b より前に来たことを意味します。 インデックス hierarchyid に深さ優先順では、データ型があり、深さ優先検査で近接ノードは互いに近い格納します。 たとえば、あるレコードの子は、そのレコードに隣接して格納されます。 詳細については、「 階層データ (SQL Server)」を参照してください。

  • 任意の挿入と削除のサポート: GetDescendant メソッドを使用すると、任意のノードの右側、特定のノードの左側、または任意の 2 つの兄弟間で兄弟を生成することが常に可能です。 階層に対して任意の数のノードを挿入または削除しても、比較の特性は維持されます。 ほとんどの挿入や削除では、コンパクトさも維持されます。 ただし、2 つのノード間に挿入すると、hierarchyid 値が少しコンパクトな表現で生成されます。

  • エンコードは 892 バイトに制限されています。 そのため、表現にレベルが多すぎて 892 バイトに収まらないノードは、 hierarchyid 型では表現できません。

hierarchyid 型は、共通言語ランタイム (CLR) クライアントでSqlHierarchyIdデータ型として使用できます。

Remarks

hierarchyid 型は、ツリーのルートからノードまでのパスをエンコードすることで、階層ツリーの 1 つのノードに関する情報を論理的にエンコードします。 このようなパスは、ルートの後にアクセスされたすべての子の一連のノード ラベルとして論理的に表されます。 この表現はスラッシュによって開始されます。ルートのみを表すパスは、単一スラッシュで表されます。 ルートの下のレベルの各ラベルは、ドットで区切られた一連の整数としてエンコードされます。

子と子の比較は、ドットで区切られた一連の整数を辞書順で比較することにより行われます。 各レベルの後ろには、スラッシュが続きます。 したがって、スラッシュは親と子を区切ります。 たとえば、次に示すのは、長さがそれぞれ 1、2、2、3、3 レベルの有効な hierarchyid パスです。

  • /
  • /1/
  • /0.3.-7/
  • /1/3/
  • /0.1/0.2/

ノードは、任意の位置に挿入できます。 /1/2/後、/1/3/の前に挿入されたノードは、/1/2.5/として表すことができます。 0前に挿入されたノードは、負の数として論理表現を持ちます。 たとえば、 /1/1/ より前のノードは、 /1/-1/として表すことができます。 ノードの先頭にゼロを付けることはできません。 たとえば、 /1/1.1/ は有効ですが、 /1/1.01/ は有効ではありません。 エラーを回避するには、GetDescendant メソッドを使用してノードを挿入します。

データ型の変換

hierarchyid データ型は、次のように他のデータ型に変換できます。

  • ToString メソッドを使用して、hierarchyid 値を nvarchar(4000) データ型として論理表現に変換します。

  • CSharp と Write を使用して hierarchyidvarbinary に変換するには、読み取り (データベース エンジン) を使用します。

  • SOAP を介して hierarchyid パラメーターを送信するには、まずそれらを文字列としてキャストします。

データベースをアップグレードする

データベースを新しいバージョンの SQL Server にアップグレードすると、新しいアセンブリと hierarchyid データ型が自動的にインストールされます。 アップグレード アドバイザーのルールにより、競合する名前を持つユーザー型またはアセンブリが検出されます。 アップグレード アドバイザーは、競合するアセンブリの名前を変更し、競合する型の名前を変更するか、コード内で 2 部構成の名前を使用してその既存のユーザー型を参照することをお勧めします。

データベースのアップグレードで、名前が競合するユーザー アセンブリが検出されると、そのアセンブリの名前が自動的に変更され、データベースが疑わしいモードになります。

アップグレード時に競合する名前を持つユーザー型が検出された場合、特別な処理は実行されません。 アップグレード後、古いユーザーの種類と新しいシステムの種類の両方が存在します。 ユーザーの種類は、2 部構成の名前でのみ使用できます。

レプリケートテーブルで hierarchyid 列を使用する

hierarchyid 型の列は、任意のレプリケートされたテーブルで使用できます。 アプリケーションの要件は、レプリケーション方法や (単方向または双方向)、使用される SQL Server のバージョンによって異なります。

一方向レプリケーション

一方向レプリケーションには、スナップショット レプリケーション、トランザクション レプリケーション、およびサブスクライバーで変更が行われていないマージ レプリケーションが含まれます。 hierarchyid 列が単方向レプリケーションとどのように連携するかは、サブスクライバーが実行されている SQL Server のバージョンによって異なります。

  • SQL Server パブリッシャーは、hierarchyid 列を同じバージョンの SQL Server サブスクライバーにレプリケートできます。特別な注意は必要ありません。

  • SQL Server パブリッシャーは 、hierarchyid 列を変換して、SQL Server Compact または以前のバージョンの SQL Server を実行しているサブスクライバーにレプリケートする必要があります。 SQL Server Compact 以前のバージョンの SQL Server では、 hierarchyid 列はサポートされていません。 これらのバージョンのいずれかを使用している場合でも、サブスクライバーにデータをレプリケートできます。 そのためには、互換性のあるデータ型に列を変換できるように、スキーマ オプションまたはパブリケーションの互換性レベル (マージ レプリケーションの場合) を設定する必要があります。

どちらのシナリオでも、列のフィルター選択はサポートされています。 これには、hierarchyid 列をフィルターで除外する処理が含まれます。 フィルターに hierarchyid 列が含まれていない限り、行のフィルター処理がサポートされます。

双方向レプリケーション

双方向レプリケーションには、サブスクライバー側で変更が行われる、更新サブスクリプションを使用したトランザクション レプリケーション、ピア ツー ピア トランザクション レプリケーション、およびマージ レプリケーションが含まれます。 レプリケーションを実行するには、hierarchyid 列を持つテーブルを双方向レプリケーション用に構成する必要があります。 以下の要件および考慮事項に注意してください。

  • パブリッシャーとすべてのサブスクライバーは、SQL Server 2016 (13.x) 以降のバージョンで同じバージョンを実行している必要があります。

  • レプリケーションではデータがバイトとしてレプリケートされ、階層の整合性を確保するための検証は実行されません。

  • ソース (サブスクライバーまたはパブリッシャー) で行われた変更の階層は、レプリケート先にレプリケートされるときに保持されません。

  • hierarchyid 列の値は、すべてのデータベースで同じバイナリ表現を持つことができます。 アプリケーション ロジックが異なるエンティティに対して同じ hierarchyid を 個別に生成すると、双方向レプリケーションで競合が発生する可能性があります。 したがって、パブリッシャー側とサブスクライバー側とで同じ値が生成され、異なる行に適用される可能性があります。 レプリケーションではこの条件がチェックされません。また、 hierarchyid 列の値をパーティション分割する組み込みの方法 IDENTITY はありません。 アプリケーションでは、このような検出されない競合を避けるために、制約またはその他のメカニズムを使用する必要があります。

  • サブスクライバーに挿入された行が孤立している可能性があります。 挿入された行の親行は、パブリッシャーで削除される可能性があります。 その結果、サブスクライバーの行がパブリッシャー側で挿入されたときに検出されない競合が発生します。

  • 列フィルターは、null 非許容 hierarchyid 列をフィルターで除外できません。 パブリッシャーの hierarchyid 列に既定値がないため、サブスクライバーからの挿入は失敗します。

  • フィルターに hierarchyid 列が含まれていない限り、行のフィルター処理がサポートされます。