【发布时间】:2010-07-29 18:13:27
【问题描述】:
我正在编写由遗留系统调用的存储过程。遗留系统的限制之一是从存储过程返回的单个结果集中必须至少有一行。标准是在第一列中返回零(是的,我知道!)。
实现这一点的明显方法是创建一个临时表,将结果放入其中,测试临时表中的任何行,然后返回临时表中的结果或单个空结果。
另一种方法可能是在执行主查询之前针对主查询中的相同 where 子句执行 EXISTS。
这些都不是很令人满意。谁能想到更好的方法。我正在考虑类似这样的 UNION 的路线(我知道这不起作用):
--create table #test
--(
-- id int identity,
-- category varchar(10)
--)
--go
--insert #test values ('A')
--insert #test values ('B')
--insert #test values ('C')
declare @category varchar(10)
set @category = 'D'
select
id, category
from #test
where category = @category
union
select
0, ''
from #test
where @@rowcount = 0
【问题讨论】:
-
在阅读@swe 的解决方案后考虑查看接受的答案!太好了,我承认我有想戳你这里的冲动;)stackoverflow.com/a/32586119/2979473
-
@ensisNoctis 除非我弄错了,否则该解决方案仅适用于您期望返回零或一个结果的情况
-
很高兴,您是 - 请允许我与您分享我公司目前正在生产的代码,这一切都归功于 StackOverflow ;) 无法在此评论中全部包含,所以我发布了另一个答案,但它仍然是@swe,只是格式更好。 stackoverflow.com/a/37046650/2979473 如果存在(任何数字 >= 1),则返回所需表中的行,否则返回另一个表中的行(或文字,如我的示例)。
-
啊哈,完全错过了 WITH TIES 提示。这很有趣,谢谢
标签: sql sql-server sql-server-2005 tsql