2013-04-17 28 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?

(我知道我可以寫一個簡單的if else語句和重複的查詢,但我有非常複雜的查詢,有很多FO他們,我只是想避免代碼重複)

回答

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