首页 > 解决方案 > 如何限制 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

如果有人可以提供帮助,我将不胜感激。

标签: sqlsql-serverdatabase

解决方案


您需要指定结果集中的列以将它们放入表中。所以:

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可以使用参数。
  • 在很多情况下,存储过程可以写成用户定义的函数。
  • 您可以传入一个表变量以返回一个表(尽管这需要用户定义的类型)。

推荐阅读