存储过程中的“select *”如何执行?

Posted

技术标签:

【中文标题】存储过程中的“select *”如何执行?【英文标题】:How is "select *" inside a stored procedure executed? 【发布时间】:2011-02-11 16:18:59 【问题描述】:

如果您有一个 (Sybase) 存储过程,它执行“选择 * from ... where ...”,它是如何工作的? * 什么时候扩展到所有列?在 sproc 创建时,在 sproc 编译时,执行时等?

我正在使用像这样的 sproc,它没有返回其中一列,这让我认为它是在创建 sproc 时,但我找不到任何参考来确认这一点。

编辑:我已经验证重新编译存储过程不会导致重新评估 * 这几乎证实了我最初的想法,但仍在寻找记录此行为的参考。

【问题讨论】:

你能发布你的存储过程吗? 您可以随意更改存储过程吗?我通常会避开select *,这也是原因之一。 我不认为它在存储过程创建时,更有可能在它构建执行路径时。 @user779 - 您是在视图中使用SELECT * 还是直接在存储过程本身中使用? +1 @Martin - 如果您有视图,请确保执行 sp_refreshviews 以更新视图定义。 【参考方案1】:

应该是执行时间。您可以按照以下步骤测试您的理论:

    创建一个虚拟表 MY_DUMMY_TABLE 有 1 个字段(让我们称之为 “身份证”)

    编写一个存储过程 无非选择 * from MY_DUMMY_TABLE

    观察存储过程确实 确实返回您的一个字段

    更改表格以添加另一个字段 (我们称之为“笔记”)

    再次运行您的存储过程

    观察是否包含“NOTES” 在输出中

【讨论】:

-1 这个答案什么也没增加。问题说他们已经这样做了,在第 6 步他们观察到该列不包括在内!他们在问这种行为是否被记录/预期。 应该注意的是,在我发布这个答案时,他们的问题不包括这些步骤。 好点 (+1) - 我按照您的建议尝试并证明我的怀疑是正确的......仍在寻找实际记录/描述行为的位置【参考方案2】:

编译过程时会扩展*,这发生在第一次执行时。之后使用编译后的版本。

避免在生产代码中使用select *,原因如下。请参阅this 相关问题。

【讨论】:

-1:这绝对不是真的——我尝试在表中添加一列并重新编译存储过程,但它仍然返回旧列集 我很确定它正确的,但它可能不是您的问题的根源。我只是在回答你提出的问题。 我刚刚尝试创建表;创建存储过程;调用存储过程;将列添加到表中;重新编译sporc;调用 sproc ,它仍然只显示初始列

以上是关于存储过程中的“select *”如何执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何存储已执行过程中的临时表?

navicat for MySQL中的 查询编辑器中如何执行存储过程?

oracle 如何终止存储过程的运行!

如何通过数据库链接执行 Oracle 存储过程

如何在 Redshift 中的 select 语句中使用存储过程

如何在带有 Select 语句的存储过程上使用 LINQ?