2016-05-05 20 views
0

値のセットとhierarchyid列を含むテーブルがあります。階層IDセットの変更

+-----+-------------+-----------+ 
| ID | HierarchyID | Name  | HierarchyID.ToString() for clarity 
+-----+-------------+-----------+ 
| 1 |  0x58 | Testing | /1/ 
| 2 |  0x5AC0 | TChild1 | /1/1 
| 3 |  0x5AD6 | TChild1.1 | /1/1/1 
| 4 |  0x5ADA | TChild1.2 | /1/1/2/ 
| 5 |  0x68 | Example | /2/ 
| 6 |  0x6AC0 | EChild1 | /2/1 
| ... |   ... |  ... | 
+-----+-------------+-----------+ 

しかし、我々はそれの新しいデータセットを導入している現在のツリーと並んで整列し、私はそれように、レベルダウン私の現在のツリー内のすべての値をシフトする必要があります:このような何かが見えます今のように見えるはずです。

+-----+-------------+-----------+ 
| ID | HierarchyID | Name  | HierarchyID.ToString() for clarity 
+-----+-------------+-----------+ 
|  |  0x58 | OldData | /1/ 
| 1 |  0x5AC0 | Testing | /1/1/ 
| 2 |  0x5AC6 | TChild1 | /1/1/1 
| 3 | 0x5AD6B0 | TChild1.1 | /1/1/1/1 
| 4 | 0x5AD6D0 | TChild1.2 | /1/1/1/2/ 
| 5 |  0x5B40 | Example | /1/2/ 
| 6 |  0x5B56 | EChild1 | /1/2/1 
| 6 |  0x68 | NewData | /2 
| 6 |  0x6AC0 | NChild1 | /2/1 
| ... |   ... |  ... | 
+-----+-------------+-----------+ 

レベルをそれらをダウンシフトするか、私はアップデートで値を重複することなく1により、各行1を更新しなければならないの私のhierarchyid型のすべての値を更新するための簡単な方法はありますか?

+0

テーブル構造、サンプルデータ、および望ましい結果を表示します。私はあなたが何を記述しようとしているのか分かりません。 – Siyual

+0

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

1

ドキュメントを参照するだけです。 サブツリーを簡単に移動する方法があります。

Working with hierarchyid Data

サブツリーの移動の下で従業員の階層の例があります。 テーブル構造に合わせて調整する必要があります。

CREATE PROCEDURE MoveOrg(@oldMgr nvarchar(256), @newMgr nvarchar(256)) 
AS 
BEGIN 
DECLARE @nold hierarchyid, @nnew hierarchyid 
SELECT @nold = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @oldMgr ; 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION 
SELECT @nnew = OrgNode FROM HumanResources.EmployeeDemo WHERE LoginID = @newMgr ; 

SELECT @nnew = @nnew.GetDescendant(max(OrgNode), NULL) 
FROM HumanResources.EmployeeDemo WHERE OrgNode.GetAncestor(1)[email protected] ; 

UPDATE HumanResources.EmployeeDemo 
SET OrgNode = OrgNode.GetReparentedValue(@nold, @nnew) 
WHERE OrgNode.IsDescendantOf(@nold) = 1 ; 

COMMIT TRANSACTION 
END ; 
GO