我希望从我的存储过程返回一组数据,但结果只返回两组中的第一组。如何从以下内容返回一组数据:
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。
答案 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: 雅虎......很多行 遗憾... 强>