2017-12-20 19 views
0

私はSQL Serverテーブルで、次のHIERARCHYIDの列があるとします - は基本的に戻っSQL Serverの - hierarchyid型のフィールドから最初のノードを取得します

MyCol 
/1/1/ 
/2/1/ 
/3/1/1/ 
/3/1/2/ 
/3/2/1/1/ 
/3/2/1/2/ 
/4/1/ 
/4/2/ 
/5/1/ 
/6/1/ 
/7/1/ 
/8/1/ 
/8/2/ 

をそして、私は、次のINTTopNode列を返すクエリを作成したいですMyCol列の最上位レベルの値:

MyCol  TopNode 
/1/1/  1 
/2/1/  2 
/3/1/1/  3 
/3/1/2/  3 
/3/2/1/1/ 3 
/3/2/1/2/ 3 
/4/1/  4 
/4/2/  4 
/5/1/  5 
/6/1/  6 
/7/1/  7 
/8/1/  8 
/8/2/  8 

私はhierarchyid型のデータ型を使用することにかなり新しいだとcorrecを見つけるの問題が生じていますこの整数を返すことができるようにするには、GetDescendant,GetLevelなどの間の関数を使用します。

どのようにすれば可能なのでしょうか?

+0

は、それは常に最上位のノードのための単一の数字ですか? – scsimon

答えて

2

はあなたのケースでこの仕事をしていますか?

DECLARE @T TABLE(X HIERARCHYID) 
INSERT @T SELECT '/1/1/' 
INSERT @T SELECT '/2/1/' 
INSERT @T SELECT '/3/1/' 
INSERT @T SELECT '/3/2/' 
INSERT @T SELECT '/3/3/' 
INSERT @T SELECT '/3/4/' 

SELECT 
    X.GetAncestor(X.GetLevel()-1), 
    X.GetAncestor(X.GetLevel()-1).ToString() 
FROM @T 

あなたはその後、交換する単純なものからキャストすることによってint型を導き出すことができます - >

TopLevel = CAST(REPLACE(X.GetAncestor(X.GetLevel()-1).ToString(),'/','') AS INT) 
+0

TopLevelのためにintにキャストを追加しました。 –

+0

申し訳ありませんが、私は完全にあなたの答えを誤解しました - それは完璧です! *ありがとうございます* –

2

これは動作するはずです:

SELECT SUBSTRING(YourString, CHARINDEX('/', YourString) + 1, CHARINDEX('/', YourString,CHARINDEX('/', YourString)+1) - (CHARINDEX('/', YourString) + 1)) 
FROM YourTable; 
+0

ありがとうございました! - 私は** HOPING **だったので、それを直接HIERARCHYIDフィールドとして扱う方法がありましたが、それは間違いなくトリックを行うでしょう!! –

関連する問題