在SQL Server 2005或更高版本中,您可以使用以下语法返回可变数量的行:
Declare @Limit Int
Set @Limit=5
Select Top(@Limit) * From TableName
是否有一些神奇的值,你可以使用它让它返回所有行? (在这里考虑参数化存储过程)。设置限制为0
将不返回任何行,使用负值将生成运行时错误。
我很确定这是不可能的,但我还没有找到明确的答案。没有If/Else
阻止这项工作并复制相当复杂的查询将会很好。
答案 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