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

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

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

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

【问题讨论】:

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

标签: sql database stored-procedures sybase


【解决方案1】:

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

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

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

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

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

  5. 再次运行您的存储过程

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

【讨论】:

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

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

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

【讨论】:

  • -1:这绝对不是真的——我尝试在表中添加一列并重新编译存储过程,但它仍然返回旧列集
  • 我很确定它正确的,但它可能不是您的问题的根源。我只是在回答你提出的问题。
  • 我刚刚尝试创建表;创建存储过程;调用存储过程;将列添加到表中;重新编译sporc;调用 sproc ,它仍然只显示初始列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2013-01-23
相关资源
最近更新 更多