うにおんしてとか基本的なところをやった程度だった。
で、以前いろいろ調べて参考にさせてもらって作ったものはSSDの事故により紛失。
先日から作り直すことになった。
ほしい情報は
ID、ネストレベル、パス。
なんかうまくかけないし、三つに分かれちゃったけど、
親ID、IDな階層構造を持つテーブルから取得するストアドができたかな。
疲れているときのビールでふらふらしながらコードを書くのは面白い。
元はこちら。
--情報取得
CREATE PROC [dbo].[S_showHierarchy]
(
@tableName nvarchar(256),
@parentFieldName nvarchar(256),
@childFieldName nvarchar(256),
@rootId int,
@idpath nvarchar(256) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON
--テンポラリテーブル作成
CREATE TABLE #hierarchy(id int NOT NULL,level int NOT NULL,idpath nvarchar(256))
--呼び出し
EXEC [dbo].[S_createHierarchyTable]
@tableName = @tableName,
@parentFieldName = @parentFieldName,
@childFieldName = @childFieldName,
@rootId = @rootId,
@idpath = @idpath OUTPUT
--最後に返却用にSELECTを実施
SELECT * FROM #hierarchy
END
--テーブル作成
CREATE PROC [dbo].[S_createHierarchyTable]
(
@tableName nvarchar(256),
@parentFieldName nvarchar(256),
@childFieldName nvarchar(256),
@rootId int,
@idpath nvarchar(256) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @minID int, @whereToken nvarchar(1024)
--指定親ID取得
SET @whereToken = @childFieldName+' = '+STR(@rootId)
EXEC dbo.S_getHierarchyMinID @tableName,@childFieldName,@whereToken,@minID OUTPUT
--ネストパスの生成
SET @idpath = @idpath + '-' + CONVERT(nvarchar,@minID)
--PRINT REPLICATE('-', @@NESTLEVEL * 1) + STR(@minID) + STR(@@NESTLEVEL) + @idpath
PRINT CONVERT(nvarchar,@minID) + '|' + CONVERT(nvarchar,@@NESTLEVEL) + '|' + @idpath
--テンポラリテーブルに挿入
INSERT INTO #hierarchy VALUES(@minID,@@NESTLEVEL,@idpath)
--■次の階層の準備処理 --
--指定親ID配下の最小値取得
SET @whereToken = @parentFieldName+' = '+CONVERT(nvarchar,@rootId)
EXEC dbo.S_getHierarchyMinID @tableName,@childFieldName,@whereToken,@minID OUTPUT
--SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root)
WHILE @minID IS NOT NULL
BEGIN
--再帰
EXEC dbo.S_createHierarchyTable @tableName,@parentFieldName,@childFieldName,@minID, @idpath
SET @whereToken = @parentFieldName+' = '+CONVERT(nvarchar,@rootId)+' AND '+@childFieldName+' > '+CONVERT(nvarchar,@minID)
EXEC dbo.S_getHierarchyMinID @tableName,@childFieldName,@whereToken,@minID OUTPUT
END
END
--最小ID取得
CREATE PROC [dbo].[S_getHierarchyMinID]
(
@tableName nvarchar(256),
@childFieldName nvarchar(256),
@whereToken nvarchar(256),
@minID int OUTPUT
)
AS
DECLARE @SqlQuery nvarchar(1024)
SET @SqlQuery = '' +
'SELECT @minID = MIN('+@childFieldName+')' +
' FROM '+@tableName+
' WHERE '+@whereToken + ''
--PRINT @SqlQuery
EXECUTE SP_EXECUTESQL @SqlQuery,N'@minID int OUTPUT', @minID OUTPUT
0 件のコメント:
コメントを投稿