仅返回存储过程的最后一个选择结果

时间:2010-05-19 16:09:10

标签: sql-server sql-server-2005

要求说明:存储过程意味着根据5个标识符搜索数据。如果存在精确匹配,则仅返回完全匹配,如果没有,但非空参数上存在完全匹配,则仅返回这些结果,否则返回任何4个非空参数的任何匹配...依此类推

我的(简化)代码如下所示:

create procedure xxxSearch @a nvarchar(80), @b nvarchar(80)...
as 
begin
  select whatever 
    from MyTable t
    where ((@a is null and t.a is null) or (@a = t.a)) and
          ((@b is null and t.b is null) or (@b = t.b))...

    if @@ROWCOUNT = 0
    begin
        select whatever 
          from MyTable t
          where ((@a is null) or (@a = t.a)) and
                ((@b is null) or (@b = t.b))...
          if @@ROWCOUNT = 0
          begin
             ...
          end
    end
end

因此,可以选择更多的结果集,第一个结果为空,我只需要最后一个。 我知道很容易在应用程序端获得唯一的最后一个结果集,但是我们所有的存储过程调用都通过一个框架,该框架需要在第一个表中获得重要结果,并且我不急于更改它并测试所有现有的SP。

有没有办法只返回存储过程的最后一个选择结果? 有没有更好的方法来完成这项任务?

2 个答案:

答案 0 :(得分:4)

使用表变量:

create procedure xxxSearch @a nvarchar(80), @b nvarchar(80)...
as 
begin
  DECLARE @res TABLE(...)
  INSERT INTO @res(...)
  select whatever 
    from MyTable t
    where ((@a is null and t.a is null) or (@a = t.a)) and
          ((@b is null and t.b is null) or (@b = t.b))...

    if @@ROWCOUNT = 0
    begin
        INSERT INTO @res(...)
        select whatever 
          from MyTable t
          where ((@a is null) or (@a = t.a)) and
                ((@b is null) or (@b = t.b))...
          if @@ROWCOUNT = 0
          begin
             ...
          end
    end
    SELECT ... FROM @res
end

答案 1 :(得分:2)

您可以使用本地表变量来保存结果,然后使用SELECT,因此只有一个SELECT。

您可以重复查询(最终能够摆脱嵌套):

create procedure xxxSearch @a nvarchar(80), @b nvarchar(80)... 
as  
begin 
  IF EXISTS (select whatever  
    from MyTable t 
    where ((@a is null and t.a is null) or (@a = t.a)) and 
          ((@b is null and t.b is null) or (@b = t.b))... )
  BEGIN
    select whatever  
        from MyTable t 
        where ((@a is null and t.a is null) or (@a = t.a)) and 
              ((@b is null and t.b is null) or (@b = t.b))... 
    RETURN
  END

   etc. 
end 

或者您可以找到一种方法将所有查询合并到一个查询中 - 可能使用UNION。