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;