Sql 使用“选择顶部(@variable)*From”时是否可以指定“无限”?
在SQL Server 2005或更高版本中,可以使用以下语法返回可变行数: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
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我本来打算在答案中添加查询主表的内容,但我不确定您是否正在连接多个表。