sql - 如何限制 MS-SQl 存储过程的结果
问题描述
问题是...我将获得执行程序的命令...例如EXEC SAMPLE_PROCEDURE_NAME
,我无法修改或将计数/数字传递给该程序
现在,在执行时,该过程正在返回所有行。我想限制收到的行数
以下是我尝试过的一些事情(程序名称= Demo4
)
这个失败了
select top 10 * FROM (EXEC Demo4)
这个也失败了
;WITH Results_CTE AS
(
EXEC Demo4
)
select top 10 *
FROM Results_CTE
这个也失败了
DECLARE @tmpNewValue TABLE (*)
INSERT INTO @tmpNewValue
EXEC Demo4
select top 10 * FROM @tmpNewValue
如果有人可以提供帮助,我将不胜感激。
解决方案
您需要指定结果集中的列以将它们放入表中。所以:
declare @tmpNewValue table (
col1 type1,
col2 type2,
. . .
);
然后你可以插入行:
INSERT INTO @tmpNewValue
EXEC Demo4;
并返回 10 个任意行:
select top 10 *
from @tmpNewValue;
您需要ORDER BY
获取十个特定行(例如“第一”,无论这意味着什么)。
如果您希望它们按插入顺序排列并且没有其他方法,则可以在表中使用标识列:
declare @tmpNewValue table (
id int identity(1, 1),
col1 type1,
col2 type2,
. . .
);
insert into @tmpNewValue (col1, col2, . . . ) -- no `id` column here
exec Demo4;
然后:
select top (10) *
from @tmpNewValue
order by id;
我应该补充一点,我强烈反对返回这样的结果集。存储过程不应被视为可查询对象。代码可能会因为某人对存储过程的小修改而中断——比如添加调试或审计代码。
还有其他方法可以处理这些情况:
- 如果不需要多行,则
OUTPUT
可以使用参数。 - 在很多情况下,存储过程可以写成用户定义的函数。
- 您可以传入一个表变量以返回一个表(尽管这需要用户定义的类型)。
推荐阅读
- json - 如何在 Sqlite 中加入多个 JSON 列
- amcharts - x轴上的Amchart水平滚动条
- c# - 'else if' 不能使用 TryParse 中的变量
- javascript - 在 CharJS 中重新激活数据值
- reactjs - 情感 css 功能未呈现样式(React)
- python - 求解一对迭代微分方程
- dart - 为什么 Dart 只允许在初始化列表上启动 Final 变量?
- php - 删除 WooCommerce 订单上的美分(四舍五入到最接近的美元)
- javascript - GetJSON 方法仅拉取数组而不拉取特定字段
- javascript - JSON 对象 - JavaScript、C#、MVC