2014-09-04 173 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