Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL Server中从表中检索前N行或所有行_Mysql_Sql_Sql Server - Fatal编程技术网

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
上发布一条同样的帖子,并澄清它。是的,明白了,但这是一个大问题:)