2014-10-08 2 views
0

이 함수에서 "길이가 잘못된 매개 변수가 LEFT 또는 SUBSTRING 함수에 전달되었습니다"라는 오류가 발생하면 "Abracadabra {34}"또는 문자열에 "{}"이 없다면 가져 가지 않습니다. "CASE"가 있는데 제대로 작동하지 않는 것 같습니다. 확실히 그것은 전형적인 경우 - Abracadabra {34} "와 완벽하게 작동하지만 쿼리의 복잡한 조건 때문에이 함수를 다른 경우와 비교할 수 없습니다. 어쩌면 당신은 실수를 할 수 있습니다. 도와주세요.잘못된 연결 매개 변수가 행 연결의 LEFT 또는 SUBSTRING 함수에 전달되었습니다.

CREATE FUNCTION func (
@nidop int 
) 
RETURNS varchar 
BEGIN 
DECLARE @sreturn varchar(1000); 
SET @sreturn = ''; 
SELECT 
@sreturn = CASE CHARINDEX('{', wp.description) 
WHEN 0 THEN @sreturn 
ELSE 
@sreturn + SUBSTRING(wp.description, CHARINDEX('{', wp.description) + 1, 
CHARINDEX('}', wp.description) - CHARINDEX('{', wp.description) - 1) + ',' 
END 
FROM 
(/*some select*/) ttt, RB_WORKPLACE wp 
WHERE wp.classified = ttt.ap 
ORDER BY CASE WHEN CHARINDEX('{', wp.[description]) > 0 THEN 
CONVERT(INT, 
SUBSTRING(wp.[description], 
      CHARINDEX('{', wp.[description]) + 1, 
      CHARINDEX('}', wp.[description]) - CHARINDEX('{', wp.[description]) - 1) 
) 
ELSE 0 
END; 
SET @sreturn = SUBSTRING(@sreturn, 1, LEN(@sreturn) - 1) 
RETURN @sreturn; 
END; 

문제에 대해 더 자세히 알려 드리려고합니다. 이 함수에서 내가 오라클에서 다른 기능을 마이그레이션하기 위해 노력하고있어 :

create or replace function func(nidop in number) return varchar2 as 
    sreturn varchar2(1000); 
begin 
    select listagg(to_number(substr(wp.description, instr(wp.description, '{') + 1, 
            instr(wp.description, '}') - instr(wp.description, '{') - 1)), ',') within group(order by to_number(substr(wp.description, instr(wp.description, '{') + 1, instr(wp.description, '}') - instr(wp.description, '{') - 1))) 
    into sreturn 
    from (/*some select*/) ttt, workplace wp 
    where wp.classified = ttt.ap; 
    return sreturn; 

exception 
    when others then 
    return null; 
end func; 

가 Temporaly 내가이 광산하지 쿼리를 변경하는 "XML 경로 ('')"쿼리처럼, 덕분에 모두 도움. 예를 들어 varchar (50) 대신 varchar를 반환했기 때문에 하나의 항목 만있었습니다 (내 경우)

+1

SELECT @local_variable = @ local_variable의 일부 함수는 연결을 수행하기위한 신뢰할 수있는 방법이 아니라는 점에 유의해야합니다. 문서에서는 특히 표현식이 각 행에 대해 한 번만 평가된다는 보장이 없음을 경고합니다. –

+0

그리고 스칼라 함수는 대단히 비효율적입니다. 스칼라가 아닌 인라인 테이블 값 함수로 변경하는 것을 고려해야합니다. –

+0

또 다른 제안은 여기서 사용하는 조인의 구식 버전 대신 ANSI-92 스타일 조인을 사용하는 것입니다. 매개 변수를 가지고 있지만 게시 한 코드의 어느 곳에서나 참조되지 않기 때문에 명확하게이 코드의 중요한 부분을 빠뜨린 것입니다. –

답변

1

ORDER BY 절에서 오류가 발생했습니다. SELECT에있는 것과 같은 조건 (CASE 또는 IIF)으로 감싸지 않았습니다. 다음으로하여 순서를 변경 :

ORDER BY CASE WHEN CHARINDEX('{', wp.[description]) > 0 THEN 
CONVERT(INT, 
    SUBSTRING(wp.[description], 
       CHARINDEX('{', wp.[description]) + 1, 
       CHARINDEX('}', wp.[description]) - CHARINDEX('{', wp.[description]) - 1) 
    ) 
    ELSE 0 
    END; 

또한, 단순히 VARCHAR 길이없이 입력 반환을 지정하는 좋은 생각이 아니다. VARCHAR/NVARCHAR의 기본 너비는 명시된 컨텍스트에 따라 1 또는 30입니다. 지역 변수는 VARCHAR(1000)으로 선언되었으므로 출력 유형 선언에 동일한 1000을 사용해야합니다.

+0

예, 실수가 있었지만 메인은 아닙니다. 문제가 논의 된 후 order by 절을 추가했습니다. 하지만 대단히 감사합니다. 지금 내 게시물을 변경해야한다고 생각합니다. – Nixton

+0

@ 닉슨, 지금 혼란 스러워요. CASE 문을 추가 한 후에 오류가 발생하지 않았습니다. 이제는 '@ sreturn'에 단 1 개의 항목 만 표시되지만 다른 문제입니다. –

+0

하지만 나는 멈추지 않았다. ( SSMA 디버그 기능의 마지막 줄에서 전체 문자열이 표시되지만 선택 항목에서 단 1 개의 항목 만 가져 오는 경우.이 문제에 대해 다른 항목을 만들어야합니까? – Nixton

관련 문제