2

SQL 2008 で Hierarchy データ型を使用します。階層内のノードは次のようになります。

value   node 
36    /8/1/
38    /8/2/
34    /8/3/
40    /8/4/
42    /8/5/
44    /8/6/
46    /8/7/
48    /8/8/

/8/3/ と /8/1/ が入れ替わるようにノードを再配置したいと思います。これを行う方法について何か考えはありますか?

私がこれまでに持っている唯一の考えは、すべてのノードを配列のレベルにロードし、それらを希望どおりに並べ替え、テーブルから削除し、ソートされた形式で挿入することです。

4

2 に答える 2

4

(あなたの例のように)事前に操作したいhierarchyid値がわかっている場合は、それを直接行うことができます。例:

-- Place 1st node between 2nd and 3rd
UPDATE yourTable SET node = CAST('/8/2.5/' AS hierarchyid) WHERE value = 36;
-- Move 3rd node to 1st
UPDATE yourTable SET node = CAST('/8/1/' AS hierarchyid) WHERE value = 34;

新しいhierarchyid値を動的に取得する必要がある場合は、GetDescendant ()関数とGetAncestor()関数を調べてください。これを使用すると、例は次のようになります。

DECLARE @Parent hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid

-- Grab hierarchyids from 2nd and 3rd node
SELECT @Child1 = node FROM yourTable WHERE value = 38;
SELECT @Child2 = node FROM yourTable WHERE value = 34;
-- Get the parent hierarchyid
SELECT @Parent = @Child1.GetAncestor(1);

-- Update 1st node to end up between 2nd and 3rd
UPDATE yourTable SET node = @Parent.GetDescendant(@Child1, @Child2) WHERE value = 36;
-- Update 3rd node to end up before 2nd
UPDATE yourTable SET node = @Parent.GetDescendant(NULL, @Child1) WHERE value = 34;

この例では、hierarchyidは同じままではないことに注意してください。少なくとも1つは、その位置に「分数」を使用することになります(たとえば、「/8/3/」の代わりに「/8/ 2.5 /」)。

于 2009-08-30T10:41:35.377 に答える
0

解決策を見つけました

http://technet.microsoft.com/en-us/library/bb677256.aspx

于 2009-08-30T10:39:40.093 に答える