T-SQL Родительская дочерняя иерархия - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть таблица, и изначально она имеет одну запись следующим образом

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 и создавать запись в таблице, если она не существует, и возвращать идентификатор созданной записи или существующей записи. Итак, в моем примере с вводом All; World; NA таблица должна выглядеть следующим образом после выполнения запроса

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

, и он создал 2 записи, и ID = 3 возвращается с пути All; World; NA представляет ID = 3

Если я предоставлю другой ввод, такой как «Все», «Мир», «NA», «Канада», то он создаст еще одну запись и вернет ID = 4. Если я перезапущу запрос с вводом «Все», «Мир», «NA», «Канада», он обнаружит, что запись существует, и вернет ID = 4

.

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 13 декабря 2011

Вот что вы можете начать с:

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

Я оставляю это наготове для оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...