函数始终返回null

时间:2014-09-04 06:31:35

标签: sql-server recursion user-defined-functions

我编写了一个函数来查找某事物的基本单位(数据存储在表格中)。 这就是表格的样子:

pcode      packname                                           baseunit
1          BU                                                 0
2          DU                                                 1
3          du1                                                2
4          tab                                                0
5          strip                                              4
6          box                                                5
7          cart                                               6

这里我想返回给定代码的基本名称。例如,如果我用'7'调用该函数,它应该返回“tab”。如果baseunit列是基本单元,则其包含值0,否则为其baseunit的pcode。我想找到层次结构中最顶层的项目。 我为此编写了一个函数,它总是返回null。

alter function [dbo].[findbasepack1](@derpack varchar(10))
returns nvarchar(50) 
as
begin
  declare @baseunit numeric(18,0)
  declare @pname nvarchar(50)
  set @baseunit= (select baseunit from packing where pcode=@derpack)
  if( @baseunit = 0)
  begin
    set @pname = ( select packname from packing where pcode = @baseunit)
  end
  else
  begin
    set @pname = dbo.findbasepack1(@baseunit)
  end
return @pname
end
GO

我已尝试过递归和迭代,但它似乎无法工作。如果有人可以指出我出错的地方,这将是一个很大的帮助。

1 个答案:

答案 0 :(得分:2)

我试图纠正一些错误,这是代码:

ALTER FUNCTION [dbo].[findbasepack1]
(
    @derpack int
)
RETURNS nvarchar(10)
AS
begin
  declare @baseunit numeric(18,0)
  declare @pname nvarchar(10)
  set @baseunit= (select baseunit from packing where pcode=@derpack)
  if( @baseunit = 0)
  begin
    set @pname = ( select packname from packing where pcode=@derpack)
  end
  else
  begin
    set @pname = dbo.findbasepack1(@baseunit)
  end
return @pname
END

这是我用的表

CREATE TABLE [dbo].[packing](
    [pcode] [int] NOT NULL,
    [packname] [varchar](10) NOT NULL,
    [baseunit] [int] NOT NULL
)

对于输入7,它返回'tab'。在第二个选择中出现问题,您将'pcode'与'@ baseunit'进行比较,而不是'@packpack'。

希望有所帮助。作为旁注,您还可以在单​​个选择中选择“baseunit”和“pname”列,而不是两次。