根据条件使用top

时间:2013-04-17 18:28:42

标签: sql sql-server-2008-r2

我的存储过程中有一个参数,用于指定要选择的行数。 (可能的值: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的情况下实现这一目标?

(我知道我可以编写一个简单的if else语句和重复查询,但是我有很多复杂的查询,并且它们有很多,我只是想避免代码重复)

2 个答案:

答案 0 :(得分:1)

一种方法是将大数字放入:

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

select top(@RowsToUse) * from myTable

答案 1 :(得分: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