代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

返回存储过程的子集

  •  2
  • Mongus Pong  · 技术社区  · 15 年前

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

    其中一些返回大量数据。有时,代码需要从存储过程返回少量数据。得到一个 单一的 clients name,我需要调用一个返回 十二 表和 950个 排。

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

    我能让SQL Server只返回一个子集吗?( 一张表,或者更好的是一张表的一行 )存储过程的?

    我必须支持SQL Server 2000+

    3 回复  |  直到 11 年前
        1
  •  3
  •   Christian Hayter    15 年前

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

    但是,您可以创建一个新过程来调用原始过程,然后修剪结果。实现这一点的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
    

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

    你肯定会为此支付一笔绩效罚款。不过,你会的 只有 支付服务器内部的惩罚,您将不必通过网络连接向客户机发送大量不必要的数据。

    编辑-其他建议

    • 请求允许将magic find客户机逻辑分解为单独的过程。然后,您可以编写一个遵循“规则”的替换过程,而不是绕过它们。
    • 询问是否可以删除对SQL 2000的支持。如果答案是“是”,那么您可以编写一个clr过程来使用所有12个结果集,只使用您想要的结果集,并对其进行筛选。
    • 放弃并从您的客户机代码调用原始过程,但找到一种测量性能下降的方法,这样您就可以对备份有硬数据的决策施加一些影响。
        2
  •  1
  •   gbn    15 年前

    不可以。存储过程是单个可执行实体。

    不得不 创建一个新的存储过程(返回所需的内容)或修改当前存储过程(到分支),如果要这样做:项目策略不能更改 真实生活

    编辑:我没有告诉你…

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

    不要“重复使用”一个调用来获取更多数据并将其缓存。毕竟,这确实是您的Frankenstein存储过程在客户机和数据库之间提供一致契约的意图…?

        3
  •  0
  •   adopilot    15 年前

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

    当您用SORED过程填充数据集时,会在数据集中为每个数据集返回更多的结果集。 结果集一个数据表。