我的存储过程中有一个参数,用于指定要选择的行数。 (可能的值: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语句和重复查询,但是我有很多复杂的查询,并且它们有很多,我只是想避免代码重复)
答案 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