在单个结果返回的存储过程中执行多个SQL语句

时间:2014-01-16 20:48:32

标签: 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, displaypartno
    FROM Products
    WHERE catalogid = @CatalogID AND source = @Manufacturer
END

因为只有当第一个SQL没有返回任何行时我才需要执行第二个SQL,所以我认为我不能使用UNION。

4 个答案:

答案 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

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

答案 1 :(得分: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

答案 2 :(得分:0)

你应该使用IF NOT EXIST()函数。

创建变量表并添加第一步返回的项目。然后,从您在IF NOT EXIST条件下创建的变量表中选择所有项目,并记下第二步。

如果您不创建变量表,则从Categories表中选择冗余select。

另外,为什么你不会使用@@ ROWCOUNT http://www.johnpapa.net/t-sql-if-not-exists-versus-rowcount/

答案 3 :(得分:0)

  

这是最好的例子。如果你有多个查询和一个查询   给出错误,另一个将无法运行。让我们同意   给出错误..有多个数据存在于SALARY中   超过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: 雅虎......很多行 遗憾...