gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:09:39 25 4
gpt4 key购买 nike

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

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

SELECT * FROM sp_who2
WHERE login='bmccormack'

但是这个方法不起作用。有哪些好的做法可以实现查询存储过程返回数据的目标,最好不必查看原始存储过程的代码并对其进行修改。

最佳答案

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

  1. 将过程切换到 User Defined Function 。如今,世界各地的人们都在制作应该是函数的存储过程。这是一个教育问题。你的情况就是一个很好的例子。如果您的过程是 UDF,您可以执行以下操作,正如您直观地认为应该能够执行的那样:

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

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

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

关于sql - 使用SQL过滤存储过程的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com