T-SQL父子层次结构

时间:2011-12-08 18:43:54

标签: tsql

我有一张桌子,最初它有一个条目如下

ID   ParentID  Title
1    NULL      All

这个表我用来创建树结构。该表需要填充存储在CSV文件中的以下数据。每行代表一个树路径

All;World               
All;World;NA
All;World;NA;Canada             //Here each item represents the tree node and separated by ;

--
--

我希望编写一个查询,它将接受像All; World; NA这样的输入,如果不存在则在表中创建条目,并返回创建的条目或现有条目的ID。所以在我的示例中输入All; World; NA在运行查询后,表应该如下所示

ID   ParentID  Title
1    NULL      All
2    1         World
3    2         NA

并创建了2个条目,自路径All返回ID = 3; World; NA代表ID = 3

如果我给出另一个输入,例如All; World; NA; Canada,那么它将再创建一个条目并返回ID = 4。 如果我用输入All; World; NA; Canada重新运行查询,那么它会发现该条目存在并返回ID = 4

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以从以下内容开始:

CREATE TABLE TREE
(
    ID INT NOT NULL IDENTITY(1,1),
    ParentID INT,
    Name varchar(32)
);
GO

CREATE PROC InsertIntoTree @node varchar(512)
AS
BEGIN
    DECLARE @xml xml,@str varchar(100),@delimiter varchar(10)
    SET @delimiter =';'
    SET @xml = cast(('<X>'+replace(@node,@delimiter ,'</X><X>')+'</X>') as xml)

    DECLARE @nodes TABLE (NodeName varchar(32));

    INSERT INTO @nodes(NodeName)
    SELECT C.value('.', 'varchar(10)') as NodeName FROM @xml.nodes('X') as X(C)

    DECLARE @nodename varchar(32)
    DECLARE @nodeid int
    DECLARE @parentNodeId int
    SET @parentNodeId = null

    SELECT TOP 1 @nodename=Nodename from @nodes 
    WHILE (@@ROWCOUNT <> 0 and @nodename IS NOT NULL)
    BEGIN
        SET @nodeid = null

        SELECT @nodeid=Id FROM TREE WHERE Name=@nodename

        IF(@nodeid is null )
        BEGIN
            INSERT INTO TREE(ParentID,Name) VALUES(@parentNodeId,@nodename)
            SET @nodeid = @@IDENTITY
        END
        SET @parentNodeId = @nodeid

        delete from @nodes where NodeName=@nodename
        SELECT TOP 1 @nodename=Nodename from @nodes 
    END

END
GO

测试它:

InsertIntoTree 'A;B;C'
select * from tree

我让它准备优化。