Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用“选择顶部(@variable)*From”时是否可以指定“无限”?_Sql_Sql Server - Fatal编程技术网

Sql 使用“选择顶部(@variable)*From”时是否可以指定“无限”?

Sql 使用“选择顶部(@variable)*From”时是否可以指定“无限”?,sql,sql-server,Sql,Sql Server,在SQL Server 2005或更高版本中,可以使用以下语法返回可变行数: Declare @Limit Int Set @Limit=5 Select Top(@Limit) * From TableName 是否有一些神奇的值,可以用来让它返回所有行?这里考虑参数化存储过程。将limit设置为0将不返回任何行,使用负值将生成运行时错误 我很确定这是不可能的,但我还没有找到一个明确的答案。在不使用If/Else块的情况下完成这项工作并复制相当复杂的查询会很好。我这样做的一种方法是在limi

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

Declare @Limit Int
Set @Limit=5
Select Top(@Limit) * From TableName
是否有一些神奇的值,可以用来让它返回所有行?这里考虑参数化存储过程。将limit设置为0将不返回任何行,使用负值将生成运行时错误


我很确定这是不可能的,但我还没有找到一个明确的答案。在不使用If/Else块的情况下完成这项工作并复制相当复杂的查询会很好。

我这样做的一种方法是在limit不是-1时有条件地使用TOP,以便在需要所有结果时可以完成

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

简单的答案是转换为bigint并使用其最大可能值9223372036854775807。由于许多行不可能是任何表的一部分,因此可以确保不会遗漏任何内容。

在TOP子句中使用TOP 100%,而不是使用数字。让百分比来处理数字

SELECT TOP 100 PERCENT *
FROM TABLE_Name
如果您计划在存储过程中使用它,只需使用If..ELSE逻辑,如下所示

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

为了避免重写查询(我假设查询比问题中的SQL更复杂),您可以在特定情况下返回行计数来替换变量,例如,如果变量=0,则返回all:

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

您可以在Set子句中执行查询吗?如果是这样的话,那么您可以从Tablename中设置@Limit=select count*。您当然可以使用动态TSQL来实现这一点。您可以使用百分比来实现您的目标吗?选择TOP100%…没有特别好的理由来编写SELECT TOP 100%*。。。为什么不选择*?@Jeroen-太棒了,没想到这一点看看你的IF语句是的,这很酷,我在寻找一种不必重复查询的方法-我在问题中保持简单,不偏离重点,但是我的问题相当复杂为什么一个表中可能有2^63行是不可能的?如果他有一个有2^63行的表,我想他永远不会想要返回它们all@MaxVernon:据此,数据库的最大大小为524272 Tb。由于这么大的数字让我头疼,我将[math]:pow2,63-gt 524272tb插入powershell提示符并实现了。所以,除非你能使行数小于一个字节,否则你永远不会有一个表中有那么多行。@MaxVernon我的想法更简单:SQL Server的COUNT_BIG*返回bigint,并且与COUNT*不同,它的设计永远不会失败。很好,即使查询相当复杂,我也不想在count语句中重复它-我可以只使用主表上的count来检索上限,从先前删除的答案中复制我的注释:如果正在添加一行,并且在确定计数和实际选择数据之间添加该行,您将丢失一行,而不一定是刚才添加的那一行。@SebastianK我本来打算在答案中添加查询主表的内容,但我不确定您是否正在连接多个表。