我有一个应用程序(不幸的是)包含了很多其业务逻辑的存储过程。
其中一些返回大量数据。有时,代码将需要从存储过程返回的少量数据。要获得单个客户名称,我需要调用一个返回 12 表和 950 行的存储过程。
我无法(由于项目政治)更改现有存储过程或创建替换存储过程 - 必须调用原始的大规模过程,因为它包含查找正确客户端的逻辑。只要它使用原始的大规模程序,我就可以创建一个新程序。
无论如何,我可以让SQL服务器只返回存储过程的子集,(单个表,甚至更好的单个表的单行)?
我必须支持sql server 2000 +
答案 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
您可以使用临时表而不是表变量。原则是一样的。
你肯定会为此付出性能损失。但是,您将仅在服务器内支付罚款,您不必通过网络连接向客户端发送大量不必要的数据。
编辑 - 其他建议
答案 1 :(得分:1)
你 必须 创建一个新的存储过程(以返回你想要的)或修改当前的(到分支)如果你想这样做:项目政治无法改变现实生活
编辑:我没有告诉你这个......
对于数据库中需要的每一位数据,每次都要调用存储过程并使用你想要的位。
不要“重新使用”调用来获取更多数据并对其进行缓存。毕竟,这肯定是您的Frankenstein存储过程的目的是在客户端和数据库之间提供一致的合同......?
答案 2 :(得分:0)
您可以尝试创建SQL CLR存储过程来处理存储过程返回的所有表 在C#代码中查找您需要的数据并返回您需要的内容。但我认为这只会让事情变得更复杂。
当您使用sored过程填充数据集时,会在数据集中返回更多结果集 结果集一个DataTable。