2

既存の親子テーブルにデータを入力する方法を探します。

Tabelle: Categories
-------------------
Columns: CategoryID
         ParentID

SQL サーバーを 2008 R2 にアップグレードします。そして今、パフォーマンスを最適化するために新しい hierarchyid-datatype を追加しました。

したがって、挿入/更新が呼び出されるときに、hierarchyid-column を再編成するための sql-trigger を作成することを考えています...しかし、私は sql の専門家ではないので、誰かが私を助けてくれることを願っています。

テストクエリ: (再帰呼び出しごとに文字列を追加する必要があります)

;WITH CTE (CategoryID, ParentID, HierarchyString) AS (
    SELECT CategoryID, ParentID, HierarchyString = CAST(ParentID AS VARCHAR(8000)) + '/' + CAST(CategoryID AS VARCHAR(8000))
    FROM Categories
    UNION ALL
    SELECT r.CategoryID, r.ParentID, HierarchyString = CAST(p.CategoryID AS VARCHAR(8000)) + '/' + CAST(r.ParentID AS VARCHAR(8000))
    FROM Categories r 
    INNER JOIN CTE p ON r.CategoryID = p.ParentID
)

SELECT * FROM CTE;
4

1 に答える 1

2

多くのクエリをテストしましたが、次のクエリが機能するようになりましたが、クリーン/最適化されていないことは間違いありません...誰かがクエリを改善できるかもしれません。

;WITH CTE (CategoryID, ParentID, Hierarchy) AS (
    SELECT CategoryID, ParentID, Hierarchy
    FROM Categories
    UNION ALL
    SELECT  p.CategoryID, r.ParentID, hierarchyid::Parse(REPLACE((r.Hierarchy.ToString() + p.Hierarchy.ToString()), '//', '/'))
    FROM Categories r
    INNER JOIN CTE p ON r.CategoryID = p.ParentID
)

SELECT CTE.CategoryID, R.ParentID, CTE.Hierarchy.ToString()
FROM CTE
INNER JOIN Categories AS R ON CTE.CategoryID = R.CategoryID
WHERE CTE.Hierarchy.ToString() LIKE '%/' + CAST(CTE.ParentID AS VARCHAR) + '/' + CAST(CTE.CategoryID AS VARCHAR) + '/%' OR CTE.ParentID = 0
于 2011-03-11T19:55:14.997 に答える