2013-10-15 3 views
0

이 재귀 함수가 있습니다. 계층 값의 테이블의 경우 , 나는 ID를 받아 일정 수준 (unity_id)재귀 함수에서 확장 가능한 값 반환

CREATE FUNCTION getObs 
(
    @obs int 
) 
RETURNS table -- <-- returns table so it's a table function 
as 
return -- <- here's actual return 
(
    WITH ret2 AS(
     SELECT * 
     FROM OBS 
     WHERE OBS_Id = @obs 
     UNION ALL 
     SELECT t.* 
     FROM OBS as t INNER JOIN 
      ret2 r ON t.OBS_Id = r.UnitId 

     ) 
    SELECT * 
    FROM ret2 r 
    WHERE unity_id = 7 
) 

위해 해당 ID의 부모를 반환하고자하지만 테이블 대신 int를 반환해야, 그래서 ' ve는 이것을 시도했다. 나는 내가 원하는 속성을 선택하고있어 "RETURNS 테이블" 을 "int를 돌려"하지 놨는데 내가 SQL과 기능에 새로운 해요,

CREATE FUNCTION getObs 
(
    @obs int 
) 
RETURNS int 
as 
return 
(
    WITH ret2 AS(
     SELECT * 
     FROM OBS 
     WHERE OBS_Id = @obs 
     UNION ALL 
     SELECT t.* 
     FROM OBS as t INNER JOIN 
      ret2 r ON t.OBS_Id = r.UnitId 

     ) 
    SELECT r.OBS_Id 
    FROM ret2 r 
    WHERE unity_id = 7 
) 

어떤 도움 주셔서 감사합니다 (그것은 INT의) .

답변

0

아래 코드를 사용하여 변수를 선언하고 값을 할당 한 다음 반환 할 수 있습니다.

CREATE FUNCTION getObs 
(
    @obs int 
) 
RETURNS int 
as 
begin 
    declare @return int 

     ;WITH ret2 AS(
      SELECT * 
      FROM OBS 
      WHERE OBS_Id = @obs 
      UNION ALL 
      SELECT t.* 
      FROM OBS as t INNER JOIN 
       ret2 r ON t.OBS_Id = r.UnitId 

      ) 
     SELECT @return = r.OBS_Id 
     FROM ret2 r 
     WHERE unity_id = 7 

     return @return 

end 
0

테이블에서 변환하지 않고 int를 명시 적으로 반환하도록 함수를 변경하십시오.

as 
begin 
    declare @ret int 

    ;WITH ret2 AS(
     SELECT * 
     FROM OBS 
     WHERE OBS_Id = @obs 
     UNION ALL 
     SELECT t.* 
     FROM OBS as t INNER JOIN 
      ret2 r ON t.OBS_Id = r.UnitId 

     ) 

    SELECT @ret = r.OBS_Id 
    FROM ret2 r 
    WHERE unity_id = 7 

    return @ret 
end 
0

는 여전히 CTE를 반환되기 전에 당신은 당신이 int를 반환 할 경우 그냥 단순히 RETURN 명령 후 가치를 이전했다.

CREATE FUNCTION getObs 
(
    @obs int 
) 
RETURNS int 
as 
BEGIN 
    DECLARE @value int 

    ;WITH ret2 AS(SELECT * FROM OBS WHERE OBS_Id = @obs 
       UNION ALL 
       SELECT t.* FROM OBS as t INNER JOIN ret2 r ON t.OBS_Id = r.UnitId) 

    SELECT @value = r.OBS_Id 
    FROM ret2 r 
    WHERE unity_id = 7 

    RETURN @value -- return the int. 
END