如何从SQL Server中的表中检索前N行或所有行

时间:2014-05-30 19:03:53

标签: mysql sql sql-server

我有一个datagridview,允许用户通过点击n

来检索buttun条记录(使用文本框)或所有记录

现在想要通过一个查询检索Top N条记录或所有记录。 现在我使用2种不同的查询来实现。

//retrieving Top N Records
 SELECT Top @Rows FROM CaseDetails //@Row is parameter 

 //retrieving All records
SELECT Top (SELECT COUNT(*) FROM CaseDetails) FROM CaseDetails

如何在SQL Server中使用单个查询来执行这两个选项?

4 个答案:

答案 0 :(得分:4)

这是一个棘手的问题。

你可能在所有情况下都会传递@Rows,或者NULL选择所有行,然后通过ISNULL进行空合并以从表中选择计数以获取所有行。

// Set the Rows param first
SELECT @Rows = ISNULL(@Rows, (SELECT COUNT(*) FROM CaseDetails))

// @Rows is parameter
SELECT TOP @Rows * FROM CaseDetails

答案 1 :(得分:2)

我认为你最好通过创建像

这样的程序
create procedure sp_fetch 
@row int = NULL
as
begin
if @row = 0 or @row is null
SELECT * FROM CaseDetails
else
select top @row * from CaseDetails
end

然后你可以像

那样打电话给你的程序
exec sp_fetch(10)

答案 2 :(得分:1)

在选择之前,您无需计算所有行。 假设@Rows是一个int,那么您可以使用int的max值作为默认值。 因此,如果@Rows为0或null,则返回所有行,否则返回@Rows行:

SELECT TOP (ISNULL(NULLIF(@Rows,0), 2147483647)) * FROM CaseDetails;

答案 3 :(得分:0)

这样可以正常使用

声明参数

Create Procedure uspRetrieve
@Rows int =NULL
AS
BEGIN
   SET NOCOUNT ON;

   SET ROWCOUNT @Rows
   SELECT * FROM CaseDetails
End

如果您提供@ Row = 0,您将获得所有其他记录@Row =您的限制