使用SQL过滤存储过程的结果

2024-03-05

我查看了 Stack Overflow 上与此问题相关的其他问题,但似乎没有一个问题清楚地回答了这个问题。

我们有一个名为 sp_who2 的系统存储过程,它返回服务器上所有正在运行的进程的信息结果集。我想过滤存储过程返回的数据;从概念上讲,我可能会这样做:

SELECT * FROM sp_who2
WHERE login='bmccormack'

然而,这种方法并不奏效。实现查询存储过程返回数据的目标有哪些良好实践,最好不必查看原始存储过程的代码并对其进行修改。


没有好的方法可以做到这一点。这是存储过程的限制。您的选择是:

  1. 将程序切换到用户定义函数 http://www.sqlteam.com/article/user-defined-functions。如今,世界各地的人们都在制作应该是函数的存储过程。这是一个教育问题。你的情况就是一个很好的例子。如果您的过程是 UDF,您可以执行以下操作,正如您直观地认为您应该能够执行的那样:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. 如果你真的无法触及你的程序,并且must用 sql 完成这个,那么你就必须变得时髦了。创建另一个存储过程来包装您的原始过程。在新过程中调用现有过程并将值放入临时表中,然后使用所需的过滤器对该表运行查询,并将结果返回给外界。

从 SQL Server 2005 开始,用户定义的函数是封装数据检索的方式。存储过程和视图都是在特定情况下使用的专用工具。它们在适当的时候都很方便,但不是首选。有些人可能认为上面的示例 (A) 获取函数的所有结果,然后 (B) 对该结果集进行过滤,就像子查询一样。不是这种情况。 SQL Server 2005+ 优化了该查询;如果有一个索引login,您在查询执行计划中看不到表扫描;非常高效。

Edit:我应该补充一点,UDF 的内部结构与 SP 的内部结构类似。如果它弄乱了logic对于您想要避免的 SP,您仍然可以将其更改为函数。有几次,我采用了我不想理解的大型、可怕的程序代码,并成功地将其转移到函数中。唯一的问题是如果程序modifies除了返回结果之外的任何事情; UDF 无法修改数据库中的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用SQL过滤存储过程的结果 的相关文章

随机推荐