2011-12-08 42 views
0

我有一个表,最初它有一个条目,如下所示T-SQL亲子层次

 
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 ; 

-- 
-- 

我期待编写一个查询将于输入像所有;世界; NA和创建表项,如果不存在,并返回创建的条目的ID或现有条目。所以在我的输入例如所有;世界; NA表应该是这样的查询运行

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

之后,它创造了2项和ID = 3,因为路径全部返还;世界; NA代表ID = 3

如果我给出另一个输入,如All; World; NA; Canada,那么它会创建一个条目并返回ID = 4。 如果我重新运行查询输入所有;世界; NA;加拿大然后它会发现该条目存在,并返回ID = 4

任何人都可以帮助吗?

+0

哪个服务器是? –

+0

这是SQL Server 2005。 – Kumar

回答

0

下面是一些你可以开始:我把它留给准备优化

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

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 [email protected] 

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

     delete from @nodes where [email protected] 
     SELECT TOP 1 @nodename=Nodename from @nodes 
    END 

END 
GO 

进行测试。