工作中有个递归很多地方都要用到,不想每个存储过程中都定义,但视图里不能定义变量,只好写成函数了。
CREATE function [dbo].[F_GETDWData]
(
@ID int
)
returns @t_Level table (ID int,Level int) --根据所传递的ID,递归查询所有下级单位数据。
begin
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level
FROM MM_DW
WHERE ID =@ID
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM MM_DW a,@t_Level b
WHERE a.SJID=b.ID
AND b.Level=@Level-1
END
return
end
调用方法很简单:
SELECT * FROM F_GETDWData(@ID)
以上是SQL Server 2000中,递归得用手动循环的方式。
如果是在SQL Server 2005中,可以用下面的方式:
CREATE function [dbo].[F_GETDWData]
(
@ID int
)
returns @t_Level table (ID int,Level int) --根据所传递的ID,递归查询所有下级单位数据。
BEGIN
WITH ACT(ID,SJID)
AS
(
SELECT ID,SJID FROM RZEAM.MM_DW
WHERE ID=@ID
UNION ALL
SELECT A.ID,A.SJID
FROM RZEAM.MM_DW A,ACT
WHERE A.SJID=ACT.ID
)
INSERT @t_Level
SELECT ID,SJID FROM ACT
RETURN
END