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 

Потому что я нужен второй SQL для выполнения только если первый не возвращает строки, я не думаю, что я могу использовать UNION.

+0

вы имели в виду, чтобы добавить '1' TOP в второй оператор SQL тоже? –

+0

У меня не было «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 

Не беспокойтесь о вызове его в два раза, если у вас есть огромные требования этого запроса или делаете что-то глупое в другом месте он не будет Gause больших проблем с производительностью.

0

Вы должны использовать функцию IF NOT EXIST().

Создайте таблицу переменных и добавьте возвращаемые элементы первого шага. Затем выберите все элементы из таблицы переменных, которые вы создали в условии IF NOT EXIST, и запишите свой второй шаг.

Если вы не создаете таблицу переменных, вы выбираете избыточную таблицу из категории.

Кроме того, почему вы не используете @@ ROWCOUNT http://www.johnpapa.net/t-sql-if-not-exists-versus-rowcount/

0

Вот лучший пример. ЕСЛИ У ВАС ЕСТЬ МНОЖЕСТВЕННЫЙ ВОПРОС И ЕСЛИ ОДИН ВОПРОС ДАЙТЕ ОШИБКУ, ДРУГОЙ ОДИН БУДЕТ ОПРЕДЕЛЕН. ДАВАЙТЕ ОБА ВОПРОС ОКТЯБРЬ ДАЙТЕ ОШИБКУ .. МНОЖЕСТВЕННЫЕ ДАННЫЕ ПРЕДУСМОТРЕНЫ ГДЕ ОСТАЛЬНЫЕ БОЛЬШЕ ЧЕМ 4000 И ДЛЯ КОДА 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: Yahoo ... много строк извините ...

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