문제

For one report I am making query where users suppose have to choice TOP values based on percents or fix amount of rows.

I have two ideas

Calling two different sub stored procedure based on passed param.

if @param ='percent'
begin
      exec sp_data_TOP_by_Percent
end
if @param ='perRow'
begin
    exec sp_data_TOP_by_PerRow
end

other idea is to make dynamic TSQL query something like this

declare @command nchar(max)

select @command = 'select top(10) '
                   + case @param 
                              when 'percent' then percent 
                              else ' '
                     end
                   + ' * '
                   + 'from table 
                        order by 1';
exec sp_executesql @command

Is there third solution for something like this ?
What is better approach ? First one avoiding dynamic TSQL but is harder to maintain code in two places. I am using MSSQL2005 as databse.

도움이 되었습니까?

해결책

I'd have 2 separate queries/stored procedures just to avoid dynamic SQL.

An IF statement in one stored proc would be enough too

다른 팁

To elaborate on gbn's answer, two stored procedures is the better way to go here; additionally, I'd go one step further and place the query (sans top clause) in a table-valued function and then have the stored procedures be nothing more than a shell which calls the TVF and applies the top clause appropriately (by number of rows or percent).

The only caveat here being that if you use a TVF, try and make sure that it's an inlined TVF, as it allows the query analyzer to use statistics (much like it would a view).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top