views:

68

answers:

2

I'm writing stored procs that are being called by a legacy system. One of the constraints of the legacy system is that there must be at least one row in the single result set returned from the stored proc. The standard is to return a zero in the first column (yes, I know!).

The obvious way to achieve this is create a temp table, put the results into it, test for any rows in the temp table and either return the results from the temp table or the single empty result.

Another way might be to do an EXISTS against the same where clause that's in the main query before the main query is executed.

Neither of these are very satisfying. Can anyone think of a better way. I was thinking down the lines of a UNION kind of like this (I'm aware this doesn't work):

--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
A: 

I guess you could try:

Declare @count int
set @count = 0

Begin
Select @count = Count([Column])
From //Your query

if(@Count = 0) 
   select 0
else //run your query

The downside is that you're effectively running your query twice, the up side is that you're skiping the temp table.

AllenG
This is a similar method to the EXISTS statement I suggested in the question. The difference is the count is a little less efficient.
Chris Simpson
+4  A: 

Very few options I'm afraid.

You always have to touch the table twice, whether COUNT, EXISTS before, EXISTs in UNION, TOP clause etc

select
    id, category
from mytable
where category = @category
union all --edit, of course it's quicker
select
    0, ''
from 
where NOT EXISTS (SELECT * FROM mytable where category = @category)

An EXISTS solution is better then COUNT because it will stop when it finds a row. COUNT will traverse all rows to actually count them

gbn
There's a new bit of info for me re: EXISTS stopping when it finds a row. Thanks @gbn!
p.campbell
+1: My WITH/TOP failed to return the dummy row when the WITH doesn't have any data.
OMG Ponies
Yeah, I definitely prefer using EXISTS as it's quicker. It's just a shame that I have to write the same where clause twice. Think I'll probably end up going for this one though, thanks.
Chris Simpson