日期:2014-05-18  浏览次数:20440 次

存储过程中错误表名不抱错的问题
在SQL   Server   2005中,创建或修改村辍过程的时候,如果表的字段名写错了,就会报错。但是如果表名写错了,一点反应都没有,直接成功了。

请问这个是bug么?怎么样才能让系统报一下错?不报错很恶心,写错了代码都不知道。。

------解决方案--------------------
你总得运行测试一下吧。
------解决方案--------------------
这个好像没有办法。
------解决方案--------------------
为啥字段名写错了就能抱错呢?
---------
这个我也不明白,按理说字段名、表名错误都是应该在执行阶段被发现啊
------解决方案--------------------
SQL 2000一样也有这个毛病。
------解决方案--------------------
刚才试了试,编译的时候如果表的字段名写错了也没有报错

应该是只有运行的时候才知道了
------解决方案--------------------
延迟名称解析和编译

创建存储过程时,要分析该过程中的语句以检查语法的准确性。如果在过程定义中遇到语法错误,将返回错误,并且将不创建该存储过程。如果语句的语法正确,则存储过程的文本将存储在 syscomments 系统表中。

当首次执行存储过程时,查询处理器从该过程的 syscomments 系统表中读取该存储过程的文本,并检查该过程所使用的对象名称是否存在。这一过程称为延迟名称解析,因为存储过程引用的表对象不需要在创建该存储过程时就存在,而只需在执行该存储过程时存在。

说明 只有引用的表对象不存在时才使用延迟名称解析。所有其他对象在创建所存储的过程时必须存在。例如,引用所存储的过程中的一个现有表时,不能列出该表不存在的列。
------解决方案--------------------
延迟名称解析和编译(续)

在解析阶段,Microsoft® SQL Server™ 2000 还执行其它验证活动(例如,检查列数据类型与变量的兼容性)。如果执行存储过程时存储过程所引用的对象丢失,则存储过程在到达引用丢失对象的语句时将停止执行。在这种情况下,或在解析阶段发现其它错误时,将返回错误信息。

说明 如果删除或重命名了存储过程所引用的对象,则在执行该存储过程时会返回错误。但如果用同名的对象替换了存储过程中引用的对象,那么无须重新编译即可执行该存储过程。例如,如果存储过程 proc1 引用了表 test1,而 test1 被删除,并创建了名为 test1 的另一个表,那么 proc1 将引用该新表。不必重新编译该存储过程。
------解决方案--------------------
延迟名称解析和编译(续)

如果过程执行顺利通过解析阶段,则 SQL Server 中的查询优化器将分析该存储过程中的 Transact-SQL 语句,并创建一个执行计划。执行计划描述执行存储过程的最快方法,所依据的信息包括:

·表中的数据量。
·表中是否存在索引及索引的性质,以及数据在索引列中的分布。
·WHERE 子句条件所用的比较运算符和比较值。
·是否存在联接以及 UNION、GROUP BY 和 ORDER BY 关键字。

查询优化器在分析完存储过程中的这些因素后,将执行计划置于内存中。分析存储过程和创建执行计划的过程称为编译。优化的内存中的执行计划将用来执行该查询。执行计划将驻留在内存中,直到重新启动 SQL Server 或需要空间以存储另一个对象时为止。

在随后执行存储过程时,如果现有的执行计划仍在内存中,则 SQL Server 将再次使用它。如果执行计划不再位于内存中,则创建新的执行计划。有关更多信息,请参见存储过程和触发器执行。
------解决方案--------------------
全部参见《联机丛书》——延迟名称解析和编译
------解决方案--------------------
SQL 2000一样也有这个毛病。我感觉好是语句过多的时候才会出现这样的毛病。

------解决方案--------------------
没有见过,学习一下
------解决方案--------------------
不会是用错的数据库了吧