我想强制限制从SQL Server查询的记录数,以便我可以向用户报告他们需要优化查询。
打算将它用作报告工具,让用户说不应该提取超过10,000条记录。
SET ROWCOUNT 10000 [THROW EXCEPTION IF MORE IS SELECTED]
//user's query
SELECT ....
这可能吗?
答案 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服务器。