2014-09-04 7 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, если это базовый блок, в противном случае 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 ...'. –

+0

Пробовали ли вы использовать отладчик для выполнения кода? –

ответ

2

Я пытался исправить некоторые erros, это код:

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 он возвращает 'Вкладка'. Во втором select возникла проблема, когда вы сравниваете «pcode» с «@baseunit» вместо «@derpack».

Надеюсь, что это поможет. В качестве дополнительной заметки вы можете также выбрать столбцы «baseunit» и «pname» в одном элементе вместо того, чтобы делать это дважды.

+1

Замечательно, стоит упомянуть, что существует максимальный рекурсивный предел 32 (в SQL Server 2012) - надеюсь, данные в его таблице не исчезнут настолько глубоко. – Phill

+0

Это работает! Спасибо. @Phill спасибо за информацию, тогда я попытаюсь использовать итерацию. –

Смежные вопросы