You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server函数中查询指定节点的所有层级父节点

问题原因

你写的插入逻辑没有实现递归效果:普通SELECT ... UNION ALL ...语句只会单次执行,执行INSERT时@TempModelParents还未完成数据写入,第二部分关联查询只能读到空的表变量,自然只能查到初始的1条数据,无法逐层向上递归查找父节点。

正确实现方案

推荐直接使用内联表值函数封装递归CTE逻辑,性能比多语句表值函数更优,代码如下:

CREATE FUNCTION dbo.GetAllModelParents
(
    @InputModelId INT
)
RETURNS TABLE 
AS
RETURN
(
    WITH hierarchical AS (
        SELECT ModelId, ParentId
        FROM [dbo].[Models] 
        WHERE ModelId = @InputModelId
        UNION ALL
        SELECT parent.ModelId, parent.ParentId
        FROM [dbo].[Models] parent 
        INNER JOIN hierarchical child ON child.ParentId = parent.ModelId
    )
    SELECT * FROM hierarchical
);

调用示例

-- 查询ModelId=142对应的所有层级父节点
SELECT * FROM dbo.GetAllModelParents(142);

如果你确实需要用多语句表值函数(比如有额外逻辑需要处理中间数据),正确写法如下:

CREATE FUNCTION dbo.GetAllModelParents_MultiStatement
(
    @InputModelId INT
)
RETURNS @TempModelParents TABLE (ModelId INT, ParentId INT)
AS
BEGIN
    WITH hierarchical AS (
        SELECT ModelId, ParentId
        FROM [dbo].[Models] 
        WHERE ModelId = @InputModelId
        UNION ALL
        SELECT parent.ModelId, parent.ParentId
        FROM [dbo].[Models] parent 
        INNER JOIN hierarchical child ON child.ParentId = parent.ModelId
    )
    INSERT INTO @TempModelParents
    SELECT * FROM hierarchical;

    RETURN;
END;

内容的提问来源于stack exchange,提问作者Arash Bazrafshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:09:00