我有一个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
中使用单个查询来执行这两个选项?
答案 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 =您的限制