Sql server 使用单个结果返回在存储过程中执行多个SQL语句

Sql server 使用单个结果返回在存储过程中执行多个SQL语句,sql-server,tsql,stored-procedures,return-value,multiple-select-query,Sql Server,Tsql,Stored Procedures,Return Value,Multiple Select Query,我希望从存储过程返回一组数据,但结果只返回两组数据中的第一组。如何仅从以下内容返回一组数据: SELECT TOP 1 categoryname, displaypartno FROM Categories WHERE catalogid = @CatalogID AND source = @Manufacturer ORDER BY categoryid DESC IF @@RowCount=0 BEGIN SELECT '' AS categoryname, displaypart

我希望从存储过程返回一组数据,但结果只返回两组数据中的第一组。如何仅从以下内容返回一组数据:

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没有返回任何行时,我才需要执行第二个SQL,所以我认为我不能使用UNION。

因此,如果您有一个类别或所有匹配的产品行,您希望选择一行:

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
你就快到了,但你需要把这两部分都放在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

不要担心调用它两次,除非您对此查询有很大的需求,或者在其他地方做了一些愚蠢的事情,否则它不会带来很大的性能问题。

您应该使用IF NOT EXIST()函数

创建变量表并添加第一步返回的项。然后,从“若不存在”条件中创建的变量表中选择所有项,并写下第二步

若不创建变量表,则从类别表中选择冗余选择

还有为什么不使用@ROWCOUNT

这是最好的例子。如果有多个查询,如果有一个查询 给出一个错误,另一个肯定会运行。让我们假设这两个问题 给出错误。。在薪资较高的位置存在多个数据 大于4000且对于EMP代码7500,不存在任何数据

*

*

输出: 雅虎。。。多行
抱歉…

您是不是也要在第二条SQL语句中添加
TOP 1
?我在第二条SQL语句中没有
TOP 1
,因为catalogid是该表的主键,而在Categories中是FK。
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;