sql—递归函数中如何使用#tmp表in循环

d7v8vwbk  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(353)

我试图创建一个循环,当给定一个零件id时,它将搜索一个装配零件表,并将所有零件分解成一个大列表。
它需要递归,因为零件123可能有零件1、2、3、4、5,而零件4和5也是装配项。我想我已经想出了一些很好的方法,可以很容易地返回每个项目的part id和part level。然后我发现我不能使用temp表,所以它把我的循环击倒了。
我可以用什么来代替temp表来提供相同的函数呢?

  1. CREATE FUNCTION [dbo].[fn_getParts] (
  2. @source_part_id int
  3. , @level int
  4. )
  5. RETURNS @parts_list TABLE (
  6. [part] int NOT NULL,
  7. [level] int NOT NULL
  8. )
  9. AS
  10. BEGIN
  11. DECLARE
  12. @max int = 0,
  13. @cnt int = 0,
  14. @PID int = 0,
  15. @Plvl int = 0,
  16. @id int = 0
  17. INSERT INTO @parts_list VALUES (@source_part_id, @level)
  18. SET @level += 1
  19. SELECT [Comp_Part_ID] AS [PID], @level AS [level]
  20. INTO #chkParts
  21. FROM [assemblies]
  22. WHERE [Assy_PID] = @source_part_id
  23. SELECT @max = COUNT(*) FROM #chkParts
  24. WHILE @cnt <= @max
  25. BEGIN
  26. SELECT @PID = [PID], @Plvl = [level] FROM #chkParts
  27. INSERT INTO @parts_list
  28. SELECT * FROM [fn_getParts](@PID, @Plvl)
  29. SET @cnt += 1
  30. END
  31. RETURN
  32. END

以下是一些示例数据:

  1. CREATE TABLE [Assemblies] (
  2. [PartID] int,
  3. [Comp_PartID] int
  4. )
  5. INSERT INTO [Assemblies] VALUES
  6. (1,2),
  7. (1,3),
  8. (1,4),
  9. (1,5),
  10. (1,6),
  11. (3,9),
  12. (3,10),
  13. (10,11),
  14. (10,23),
  15. (10,24),
  16. (10,31),
  17. (11,24),
  18. (11,23)

如果我进去 SELECT * FROM [fn_getParts](1,0) 我期望如下:

  1. part,level
  2. 1,0
  3. 2,1
  4. 3,1
  5. 4,1
  6. 9,2
  7. 10,2
  8. 11,3
  9. 23,3
  10. 24,3
z8dt9xmd

z8dt9xmd1#

通过围绕递归cte Package 内联表值函数,可以在一定程度上简化代码,例如:

  1. create function dbo.fn_getParts (
  2. @source_part_id int
  3. )
  4. returns table as return (
  5. with PartsHierarchy as (
  6. select @source_part_id as part, 0 as level
  7. union all
  8. select Comp_PartID, 1 + level
  9. from Assemblies
  10. join PartsHierarchy on part = PartID
  11. )
  12. select part, level
  13. from PartsHierarchy
  14. );

然后,对不同的零件号调用它。。。

  1. select * from dbo.fn_getParts(1);
  1. part level
  2. ---- ----
  3. 1 0
  4. 2 1
  5. 3 1
  6. 4 1
  7. 5 1
  8. 6 1
  9. 9 2
  10. 10 2
  11. 11 3
  12. 23 3
  13. 24 3
  14. 31 3
  15. 24 4
  16. 23 4
  1. select * from dbo.fn_getParts(10);
  1. part level
  2. ---- -----
  3. 10 0
  4. 11 1
  5. 23 1
  6. 24 1
  7. 31 1
  8. 24 2
  9. 23 2
  1. select * from dbo.fn_getParts(11);
  1. part level
  2. ---- -----
  3. 11 0
  4. 24 1
  5. 23 1
展开查看全部

相关问题