返回存储过程的子集

时间:2009-12-30 12:36:44

标签: sql-server stored-procedures

我有一个应用程序(不幸的是)包含了很多其业务逻辑的存储过程。

其中一些返回大量数据。有时,代码将需要从存储过程返回的少量数据。要获得单个客户名称,我需要调用一个返回 12 表和 950 行的存储过程。

我无法(由于项目政治)更改现有存储过程或创建替换存储过程 - 必须调用原始的大规模过程,因为它包含查找正确客户端的逻辑。只要它使用原始的大规模程序,我就可以创建一个新程序。

无论如何,我可以让SQL服务器只返回存储过程的子集,(单个表,甚至更好的单个表的单行)?

我必须支持sql server 2000 +

3 个答案:

答案 0 :(得分:3)

无法有条件地修改无法更改源代码的过程的查询行为。

但是,您可以创建一个调用原始内容的新过程,然后调整结果。与SQL 2000兼容的方法可能是:

declare @OriginalResult table (
    // manually declare every column that is returned in the original procedure's resultset, with the correct data types, in the correct order
)

insert into @OriginalResult execute OriginalProcedure // procedure parameters go here

select MyColumns from @OriginalResult // your joins, groups, filters etc go here

您可以使用临时表而不是表变量。原则是一样的。

你肯定会为此付出性能损失。但是,您将在服务器内支付罚款,您不必通过网络连接向客户端发送大量不必要的数据。

编辑 - 其他建议

  • 请求允许将魔术查找客户端逻辑分解为单独的过程。然后,您可以编写一个遵循“规则”的替换程序,而不是绕过它们。
  • 询问是否可以删除对SQL 2000的支持。如果答案是肯定的,那么你可以编写一个CLR程序来使用所有12个结果集,只获取你想要的结果集,并过滤它。
  • 放弃并从客户端代码调用原始程序,但找到一种衡量性能下降的方法,以便您可以对使用硬数据备份的决策产生一些影响。

答案 1 :(得分:1)

不,你不能。存储过程是单个可执行实体。

必须 创建一个新的存储过程(以返回你想要的)或修改当前的(到分支)如果你想这样做:项目政治无法改变现实生活

编辑:我没有告诉你这个......

对于数据库中需要的每一位数据,每次都要调用存储过程并使用你想要的位。

不要“重新使用”调用来获取更多数据并对其进行缓存。毕竟,这肯定是您的Frankenstein存储过程的目的是在客户端和数据库之间提供一致的合同......?

答案 2 :(得分:0)

您可以尝试创建SQL CLR存储过程来处理存储过程返回的所有表 在C#代码中查找您需要的数据并返回您需要的内容。但我认为这只会让事情变得更复杂。

当您使用sored过程填充数据集时,会在数据集中返回更多结果集 结果集一个DataTable。