要求说明:存储过程意味着根据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。
有没有办法只返回存储过程的最后一个选择结果? 有没有更好的方法来完成这项任务?
答案 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。