0

저장 프로 시저에서 단일 데이터 집합을 반환하려고하지만 결과로 두 집합 중 첫 번째 집합 만 반환됩니다. 어떻게 다음에서 데이터의 한 집합을 반환 않습니다단일 결과 반환을 사용하여 저장 프로 시저에서 여러 SQL 문 실행

SELECT TOP 1 categoryname, displaypartno 
FROM Categories 
WHERE catalogid = @CatalogID AND source = @Manufacturer 
ORDER BY categoryid DESC 

IF @@RowCount=0 
BEGIN 
    SELECT '' AS categoryname, displaypartno 
    FROM Products 
    WHERE catalogid = @CatalogID AND source = @Manufacturer 
END 

내가 처음 반환하지 행이, 내가이 UNION을 사용할 수 있다고 생각하지 않습니다 경우에만 실행 두 번째 SQL을 필요로하기 때문에.

+0

당신이에'TOP 1 '추가 의미입니까? 두 번째 SQL 문도? –

+0

catalogid가 그 테이블에 대한 PK이기 때문에 두 번째 테이블에 'TOP 1'이 없지만 카테고리의 FK입니다. –

답변

0
SELECT TOP 1 categoryname, displaypartno 
FROM (
    SELECT categoryname, displaypartno, 0 AS ResultPriority 
    FROM Categories 
    WHERE catalogid = @CatalogID AND source = @Manufacturer 
    UNION ALL 
    SELECT '' AS categoryname, displaypartno, 1 AS ResultPriority 
    FROM Products 
    WHERE catalogid = @CatalogID AND source = @Manufacturer 
) t 
ORDER BY ResultPriority, categoryid DESC 
+0

이것은 완벽하게 작동했습니다. 고맙습니다. –

1

그래서 당신은 당신이 카테고리 또는 일치하는 모든 제품의 행이있는 경우 하나 개의 행을 선택합니다 :

당신은 거의 거기를하지만 당신은 IF ... ELSE 문에서 두 부분을 넣어해야합니다. 이 쿼리에 대한 엄청난 수요를 가지고 있거나 다른 곳에서 큰 성능 문제를 가우스하지 않습니다 어리석은 일을하지 않는

IF EXISTS (SELECT * 
      FROM Categories 
      WHERE catalogid = @CatalogID AND source = @Manufacturer) 

    SELECT TOP 1 categoryname, displaypartno 
    FROM Categories 
    WHERE catalogid = @CatalogID AND source = @Manufacturer 
    ORDER BY categoryid DESC 

ELSE 

    SELECT '' AS categoryname, displaypartno 
    FROM Products 
    WHERE catalogid = @CatalogID AND source = @Manufacturer 

END 

는 두 번 호출에 대해 걱정하지 마십시오.

0

IF NOT EXIST() 함수를 사용해야합니다.

가변 테이블을 만들고 첫 번째 단계에서 반환 된 항목을 추가하십시오. 그런 다음 IF NOT EXIST 조건에서 작성한 변수 테이블에서 모든 항목을 선택하고 두 번째 단계를 기록하십시오.

변수 테이블을 만들지 않으면 범주 테이블에서 중복 선택을 선택합니다.

또한 당신은 왜 늘 @@ ROWCOUNT http://www.johnpapa.net/t-sql-if-not-exists-versus-rowcount/

0
여기

최고의 예이다를 사용합니다. 여러 번 QUERY가 있고 하나의 쿼리가있는 경우 오류가 발생하면 다른 하나가 처음 실행됩니다. 양측 모두 문의하십시오. 오류가 발생했습니다. 복수 데이터가 존재합니다. 은 4000보다 크고 EMP 코드 7500에서는 현재 데이터가 없습니다.

*

Create Or Replace Procedure Proc_Test As 
    l_Str_1 Varchar2(2000); 
    l_Str_2 Varchar2(2000); 
    p_Msg  Varchar2(2000); 
    p_Err_Code Varchar2(2000); 
    l_Count_1 Number; 
    l_Count_2 Number; 
Begin 
    l_Str_1 := 'Select Sal From Cmc7 Where Sal > 4000'; 
    l_Str_2 := 'SELECT sal FROM Cmc7 WHERE empno = 7500'; 
    Begin 
    Execute Immediate l_Str_1 
     Into l_Count_1; 
    Dbms_Output.Put_Line(l_Count_1); 
    Exception 
    When Too_Many_Rows Then 
     Dbms_Output.Put_Line('yahoo... many rows'); 
    End; 
    Begin 
    Execute Immediate l_Str_2 
     Into l_Count_2; 
    Dbms_Output.Put_Line(l_Count_2); 
    Exception 
    When No_Data_Found Then 
     Dbms_Output.Put_Line('sorry...'); 
    End; 
Exception 
    When Others Then 
    p_Msg  := Sqlerrm; 
    p_Err_Code := Sqlcode; 
End; 

*

OUT의 PUT : 야후 ... 많은 행 죄송합니다 ...

관련 문제