我有一张桌子,最初它有一个条目如下
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
有人可以帮忙吗?
答案 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
我让它准备优化。