2014-09-04 175 views
1

我写了一个函数来查找某个东西的基本单位(数据存储在一个表中)。 这是表的样子:函数总是返回null

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'调用函数,它应该返回“选项卡”。如果它是基本单位,则baseunit列包含值0,否则其base unit的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 [email protected]) 
    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 

我已经尝试在递归和迭代,但它似乎并没有工作。如果有人能指出我出错的地方,这将会有很大的帮助。

+0

有趣的语法。我总是使用'SELECT @panme = packname from ...'。 – 2014-09-04 06:55:06

+0

您是否尝试过使用调试器来遍历代码? – 2014-09-04 06:55:35

回答

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 [email protected]) 
    if(@baseunit = 0) 
    begin 
    set @pname = (select packname from packing where [email protected]) 
    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返回 '标签' 的表。在第二个选择中,您将'pcode'与'@baseunit'而不是'@derpack'进行比较存在问题。

希望有所帮助。作为附注,您也可以在一次选择中同时选择“baseunit”和“pname”列,而不是执行两次。

+1

很好,值得一提的是最大递归限制为32(在SQL Server 2012中) - 希望他的表中的数据不会下降到这么深。 – Phill 2014-09-04 07:19:25

+0

This Works!谢谢。 @Phill感谢您的信息,我会尝试使用迭代。 – 2014-09-04 08:52:03