2011-12-08 44 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 

進行測試。