如果你有一个(Sybase)存储过程“select * from ... where ...”,那怎么办? *什么时候扩展到所有列?在sproc创建时,在sproc编译时,执行时间等?
我正在使用像没有返回其中一个列的sproc,它让我觉得它是在sproc创建时,但我找不到任何引用来确认。
编辑:我已经确认重新编译一个sproc并不会导致*被重新评估,这几乎证实了我的初步想法,但仍然在寻找记录此行为的参考。< / p>
答案 0 :(得分:2)
应该是执行时间。您可以按照以下步骤测试您的理论:
创建一个虚拟表MY_DUMMY_TABLE 有一个字段(我们只是调用它 “ID”)
编写一个存储过程 只有选择*来自 MY_DUMMY_TABLE
观察存储过程确实如此 确实会回到你的一个领域
更改表格以添加其他字段 (我们称之为“注意”)
再次运行存储过程
观察是否包含“NOTES” 在输出中
答案 1 :(得分:0)
编译过程时会扩展*
,这在第一次执行时发生。之后,使用编译版本。
出于这样的原因,请避免在生产代码中使用select *
。请参阅this相关问题。