2013-04-17 3 views
0

У меня есть параметр в моей хранимой процедуре, который указывает количество строк для выбора. (Возможные значения:. 0-100 0 Средства Выбрать все строки)Использовать верхнюю часть на основе условия

Для примера @Rows = 5;

Тогда я могу сделать это:

Insert into @MyTableVar 
    Select Top(@Rows) * 
    from myTable 

Теперь, как я уже говорил, если 0 подается Мне нужно вернуть все строки.
Это псевдо-код, что мне нужно:

if (@Rows=0) then select * else select top(@Rows) * 

я узнал, что есть SET ROWCOUNT, который принимает от 0 до возврата всех строк, но мне нужно сделать вставку в табличную переменную, которая не поддерживается ROWCOUNT.

Можно ли достичь этого без динамического sql?

(Я понимаю, что я могу написать простой, если другое заявление и продублировать запрос, но у меня есть довольно сложные запросы, и есть много оптоволоконный них, я просто хочу, чтобы избежать дублирования кода)

ответ

1

Одним из способов является просто поместить большое количество в:

set @Rows = 5; 
declare @RowsToUse = (case when @Rows = 0 then 1000000000 else @Rows end); 

select top(@RowsToUse) * from myTable 
1

Прежде всего, вам не хватает пункт ORDER BY, так как вы используете TOP. Вы можете сделать это:

SET @Rows = 5; 

WITH CTE AS 
(
    SELECT *, 
      RN = ROW_NUMBER() OVER(ORDER BY Id) --put the right order here 
    FROM myTable 
) 
INSERT INTO @MyTableVar 
SELECT YourColumns 
FROM CTE 
WHERE RN <= @Rows OR @Rows = 0 
Смежные вопросы