Mysql 如何在SQL Server中从表中检索前N行或所有行
我有一个Mysql 如何在SQL Server中从表中检索前N行或所有行,mysql,sql,sql-server,Mysql,Sql,Sql Server,我有一个datagridview,其中允许用户通过单击buttun来检索n记录(使用文本框)或所有记录 现在,您希望通过一次查询检索Top N记录或所有记录。 现在我使用两个不同的查询来实现 //retrieving Top N Records SELECT Top @Rows FROM CaseDetails //@Row is parameter 及 如何在SQL Server中使用单个查询来执行这两个选项 这是一个棘手的问题 实际上,您可能会在所有情况下传递@Rows,或者传递NUL
datagridview
,其中允许用户通过单击buttun
来检索n
记录(使用文本框)或所有记录
现在,您希望通过一次查询检索Top N
记录或所有记录。
现在我使用两个不同的查询来实现
//retrieving Top N Records
SELECT Top @Rows FROM CaseDetails //@Row is parameter
及
如何在SQL Server
中使用单个查询来执行这两个选项 这是一个棘手的问题
实际上,您可能会在所有情况下传递@Rows
,或者传递NULL
以选择所有行,然后通过ISNULL
进行NULL合并以从表中选择计数以获取所有行
// Set the Rows param first
SELECT @Rows = ISNULL(@Rows, (SELECT COUNT(*) FROM CaseDetails))
// @Rows is parameter
SELECT TOP @Rows * FROM CaseDetails
我认为你最好创建一个程序,比如
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)
然后你可以像这样调用你的程序
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)
在选择之前,不需要计算所有行。 假设
@Rows
是一个int,则可以使用int的最大值作为默认值。
因此,如果@Rows
为0或null,则返回所有行,否则返回@Rows
行:
SELECT TOP (ISNULL(NULLIF(@Rows,0), 2147483647)) * FROM CaseDetails;
这工作正常 声明参数
Create Procedure uspRetrieve
@Rows int =NULL
AS
BEGIN
SET NOCOUNT ON;
SET ROWCOUNT @Rows
SELECT * FROM CaseDetails
End
如果您提供@Row=0,您将获得所有记录,否则@Row=您的限额将不起作用。它给出了以下错误:
靠近'ISNULL'的语法不正确。
靠近''的语法不正确。
Ahh我没有靠近要测试的PC/IDE。可能不允许使用文字。让我调整一下我的答案。最后一句话需要是:selecttop(@Rows)*
实际上我的存储过程有大量的列(apx.20)和'join
到许多表。我想知道,如果我要写两次选择语句,即在if
内和Else
内,那么我应该把所有列都写两次吗@SeaSharp,我不确定我是否正确理解您的意思,但我可以保证创建一个SP而不是TSQL。您甚至可以在主SP中调用此SP,也可以从前端应用程序调用它。@SeaSharp,是的;从我的回答中可以看出。您必须在IF中写入两次查询,在ELSE中写入一次。但是,如果您的查询很大,那么您可以创建一个CTE,并在if.中使用该CTE。。其他的最后,这是你的决定。。哪一个最适合你的需要。你的链接是用来做什么的?只是好奇。从工作中,我无法将文字sql发布到SO,可能是因为防火墙规则。我曾经包含了一个问题的链接,其中有人有同样的问题,我发现通过包含这个链接,我可以发布sql。威德,但有效。我试着让它不被人注意,并且经常在我回家的时候把它编辑掉。WTF???英雄联盟那完全是疯了?我认为你应该在meta.stackoverflow.com
上发布一条同样的帖子,并澄清它。是的,明白了,但这是一个大问题:)