首页 > 代码库 > SQLSERVER创建该存储过程时不会出错,但是执行存储过程时报错

SQLSERVER创建该存储过程时不会出错,但是执行存储过程时报错

创建该存储过程时,不会出错,但是执行存储过程时,会报出下面这样的错误

技术分享

这是因为在存储过程创建时,它先做语法检查,如果通过了语法检查,它会尝试解析它包含的对象名,如果存在也会解析该对象引用的对象是否存在。如果引用的对象名不存在,解析会在存储过程首次执行时触发。即在首次执行存储过程时,查询处理器从 sys.sql_modules 目录视图中读取该存储过程的文本,并检查该过程所使用的对象名称是否存在。这一过程称为延迟名称解析,因为存储过程引用的表对象不需要在创建该存储过程时就存在,而只需在执行该存储过程时存在。

注意:  

只有当引用的表对象不存在时才能使用延迟名称解析。所有其他对象在创建所存储的过程时必须存在。例如,引用所存储的过程中的一个现有表时,不能列出该表不存在的列。

 

---存储过程删除中间表R_LDBG_B1_TEMP,但这条没执行成功。

if OBJECT_ID(‘R_LDBG_B1_TEMP‘,‘U‘) IS NOT NULL
   drop table R_LDBG_B1_TEMP

原因分析: R_LDBG_B1_TEMP表字段结构在执行另一个存储过程时发生变化导致其它存储过程引用了不存在的字段。

执行存储过程时先解析,当发现引用表中不存在的字段就会直接报错,无法执行。

 

有两个解决办法:

1) 在外部编程执行存储过程前删除中间表。

2) 在存储过程内部执行最后删除中间表。

SQLSERVER创建该存储过程时不会出错,但是执行存储过程时报错