Sql server 计算树路径的存储过程

Sql server 计算树路径的存储过程,sql-server,stored-procedures,tree,Sql Server,Stored Procedures,Tree,我是SQL编程的新手,但我必须完成这个过程 用户给我一个存储树的主键,一个开始顶点和结束顶点。我计算这两个顶点之间的路径,并像列表一样返回结果:attribute1=“value”,attribute2=“value” 假设是,用户必须给出树的同一分支中的路径,事实上我没有检查这个错误的可能性。安全性不是要求,但性能是。出于这个原因,我正在征求您对我执行此程序的专家意见 DB的制作方法如下: Tree(pk, ....); vertex(pk,parent,...,fk_tree); attr_

我是SQL编程的新手,但我必须完成这个过程

用户给我一个存储树的主键,一个开始顶点和结束顶点。我计算这两个顶点之间的路径,并像列表一样返回结果:attribute1=“value”,attribute2=“value”

假设是,用户必须给出树的同一分支中的路径,事实上我没有检查这个错误的可能性。安全性不是要求,但性能是。出于这个原因,我正在征求您对我执行此程序的专家意见

DB的制作方法如下:

Tree(pk, ....); vertex(pk,parent,...,fk_tree); attr_def (pk, name);
attr_usage(pk, fk_vert, fk_attr, value, next);
我知道这个数据库还有其他更好的实现,但我也有时间限制,所以我认为这个解决方案实现起来很快

现在,如果查看这些表,可以注意到不同树中的顶点之间存在可变属性,但同一树中的节点具有相同数量的节点。所以我想滑动属性的数量,就像一个带有列“a_usage.next”的列表

在这个函数中,我将对路径中遇到的顶点的所有属性求和。我通过父列从结束顶点开始到开始顶点

在这些前提之后,您是否得到了一些建议,以便发现一些错误并加快存储过程的速度

这是我的密码:

    CREATE PROCEDURE [dbo].[calc_path]
    @tree_pk int, 
    @vertexa int,
    @vertexb int,
    @result nvarchar(255) OUTPUT

AS 
BEGIN

    declare @na int
    declare @sp int
    declare @ind int = 1

    select @na=T.natt, @sp=T.split from [dbo].Tree as T where T.id_tree=@tree_pk
    --nella tabella result tengo traccia per ogni attributi i valori sommati quando esco dal ciclo
    --con un cursore riesco li concateno in una stringa
    create table #result
    (
        attr_id int not null,
        attr_name varchar(10) not null,     
    )

     insert into #result(attr_id, attr_name)
         (select attrdef.id_attr, attrdef.name from attrdef)

    alter table #result add value int default 0

     --lavoro solo sui vertici dui quel determinato albero
    declare @cmd nvarchar (max)
    set @cmd = N'create view vert_tree
    as
    select * from vertex where vertex.tree_id ='+@tree_pk
    exec (@cmd)

declare @at int
declare @parent int
declare @t_value int
declare @t_value2 int
declare @t_next int
declare @t_attr int

while @vertexa = @vertexb
BEGIN
    --seleziono il vertice b dalla vista precedentemente creata
    select @parent = vert_tree.par, @at = vert_tree.attr from vert_tree where vert_tree.vertex_id = @vertexb
    --scorro la lista dei attributi
    while @na = @ind
    begin
    --ricerco l'attributo i-esimo del vertex b
        select @t_value = a_usage.value, @t_next = a_usage.next, @t_attr = a_usage.n_att
                 from a_usage where a_usage.attr = @at and a_usage.vertex = @vertexb
        --imposto il prossimo attributo
        set @at = @t_next
        --prendo il campo value dell'attributo specifico e lo sommo con quello corrente
        select @t_value2 = @result.value from #result where #result.attr_id = @t_attr
        set @t_value2 += @t_value
        --Rimetto il valore modificato nella tabella
        update #result set #result.value = @t_value2 where #result.attr_id = @t_attr
        set @ind += 1
    end
    set @ind = 1
    SET @vertexb = @parent
END
--Return the results from culcalating path
DECLARE @app nvarchar(max)
DECLARE cur CURSOR FOR SELECT attr_name, value FROM #result

OPEN cur
FETCH NEXT From cure INTO @app
while @@FETCH_STATUS = 0
BEGIN
SET @result += @app+', '
FETCH NEXT FROM cur INTO @app
END
CLOSE cur
drop table #result
RETURN @result
END
GO

谢谢你的帮助

当你运行你发布的代码时,你会遇到什么错误;如果您可以更改表结构,我将使用
hierarchyid
和递归CTE(公共表表达式)运行发布的代码时会出现什么错误;如果可以更改表结构,我将使用
hierarchyid
和递归CTE(公共表表达式)