存储过程中的“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中的 查询编辑器中如何执行存储过程?