使用“Select TOP(@variable)* From”时可以指定“无限制”吗?

时间:2014-08-27 21:15:00

标签: sql sql-server

在SQL Server 2005或更高版本中,您可以使用以下语法返回可变数量的行:

Declare @Limit Int
Set @Limit=5
Select Top(@Limit) * From TableName

是否有一些神奇的值,你可以使用它让它返回所有行? (在这里考虑参数化存储过程)。设置限制为0将不返回任何行,使用负值将生成运行时错误。

我很确定这是不可能的,但我还没有找到明确的答案。没有If/Else阻止这项工作并复制相当复杂的查询将会很好。

4 个答案:

答案 0 :(得分:4)

简单的答案是转换为bigint并使用其最大可能值(9223372036854775807)。由于许多行不可能成为任何表格的一部分,因此您可以确定您不会错过任何内容。

答案 1 :(得分:2)

我这样做的方法是在限制不是-1时有条件地使用TOP,这样当你想要所有结果时就可以完成。

Declare @Limit Int
Set @Limit=5
IF @Limit = -1
    SELECT * FROM tbl_Products
ELSE
    Select Top(@Limit) * From tbl_Products

答案 2 :(得分:1)

而不是使用数字在顶部子句中使用TOP 100 Percent。让百分比处理数字。

SELECT TOP 100 PERCENT *
FROM TABLE_Name

如果您打算在存储过程中使用它,只需使用IF..ELSE Logic,如下所示.....

CREATE PROCEDURE TestProc
 @Top_N  INT = NULL
AS
BEGIN
  SET NOCOUNT ON;

 IF (@Top_N IS NULL)
   BEGIN
     SELECT * FROM TABLE_NAME
   END
 ELSE
   BEGIN
      SELECT TOP (@Top_N) * FROM TABLE_NAME
   END

END

使用百分比传递默认值100%,如下所示

CREATE PROCEDURE TestProc
 @Top_N  INT = 100
AS
BEGIN
  SET NOCOUNT ON;

  SELECT TOP (@Top_N) PERCENT * FROM TABLE_NAME

END

答案 3 :(得分:1)

为了避免重写查询,我假设它比问题中的SQL更复杂,您可以返回行计数以在某种情况下替换变量,例如,如果变量= 0,然后全部返回:

declare @Limit Int
set @Limit = 0

if @Limit = 0
    // get the row count from the table you are querying if @Limit = 0
    select @Limit = count(1) from TABLE_NAME

// then use the value in your query as before
select top(@Limit) * from TABLE_NAME