SQL:限制SQL Server中可以查询的行数

时间:2014-04-06 19:47:14

标签: sql sql-server sql-server-2012

我想强制限制从SQL Server查询的记录数,以便我可以向用户报告他们需要优化查询。

打算将它用作报告工具,让用户说不应该提取超过10,000条记录。

SET ROWCOUNT 10000 [THROW EXCEPTION IF MORE IS SELECTED]
//user's query
SELECT ....

这可能吗?

7 个答案:

答案 0 :(得分:1)

您可以做的是重写SQL以将TOP 10000添加到您的工具生成的任何SQL查询中。

答案 1 :(得分:1)

我想你问的是,如果结果集包含超过一定数量的记录,你是否可以设置一些会导致错误的全局。

我也认为答案是,"没有。"

但是,根据您构建和执行查询的方式,您可以预先设置SET ROWCOUNT 10001 - 请注意1以防止您想要避免的失控查询。

然后添加@Felipe建议的内容:

如果@@ ROWCOUNT = 10001 RAISERROR('结果太多。请优化您的查询',1,1);

如果您通过某种中央处理器运行所有查询都相当容易。

编辑:

这应该在SSMS中演示这个想法:

SET ROWCOUNT 2
SELECT 1 UNION SELECT 2
If @@ROWCOUNT = 2 RAISERROR ('Too many results. Please, optimize your query', 1, 1)

如果您没有收到错误,那么您的代码中会被屏蔽掉。

答案 2 :(得分:0)

在您的应用程序中,您可以创建一个变量,如果用户选择任何小于1000的值,则由用户填充@Nrow,然后选择其值,否则只需更改代码中的值以选择TOP 1000值,像这样......

DECLARE @Nrow INT = 1000;               --<-- Users Value

SET @Nrow = CASE WHEN @Nrow > 1000      --<-- Your check
                 THEN 1000 
            ELSE @Nrow END

SELECT TOP (@Nrow) *                    --<-- Query
FROM dbo.TableName

答案 3 :(得分:0)

我不确定我理解你的问题。如果用户只提供他想要的行数,那么John Nolan的答案就足够了。但是,如果您的客户提供自己的查询,那么@@ ROWCOUNT可能会帮助您:

*您的客户的查询就在这里

If @@ROWCOUNT > 10000
    BEGIN
    RAISERROR ('Please, optimize your query', 1, 1);
    END

答案 4 :(得分:0)

不,实际上并非如此。所有带有TOP和ROWCOUNT的解决方案只会在查询已经完成执行后限制输出,我相信这是你想要首先避免的。

您可以要求SQL Server生成执行计划,然后检查基数估计值。但是,请记住,估计只是估计,而且可能是关闭的。

答案 5 :(得分:0)

这使用动态SQL,所以我不知道这是不是一个问题。它被设置为在超过最大值时停止对行进行计数。另外,我创建了一个演示表。

public ActionResult MySharedAction()
{
    Account account = _accountRepository.GetAccountByEmail(System.Web.HttpContext.Current.User.Identity.Name);
    List<Campaign> campaigns = _campaignRepository.GetCampaignsByAccountId(account.AccountId);

    LayoutModel model = new LayoutModel
    {
        AccountId = account.AccountId,
        Email = account.Email,
        Name = account.Name,
        LogoPath = account.LogoPath,
    };

    foreach (Campaign campaign in campaigns)
    {
        model.AddCampaigns(campaign);
    }

    return PartialView(model);
}

答案 6 :(得分:-1)

从table_name limit no_of_rows;

中选择column_name

它适用于MySQL .....不确定SQL服务器。