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

摘要:
创建存储过程时,不会出现错误,但执行存储过程时会报告以下错误。这是因为在创建存储过程时,它首先检查语法。如果它通过了语法检查,它将尝试解析它包含的对象名称。如果它存在,它还将解析该对象所引用的对象是否存在。此过程称为延迟名称解析,因为存储过程引用的表对象在创建存储过程时不需要存在,而只在执行存储过程时存在。有两种解决方案:1)在外部编程执行存储过程之前删除中间表。2) 最后在存储过程中执行并删除中间表。

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

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

这是因为在存储过程创建时,它先做语法检查,如果通过了语法检查,它会尝试解析它包含的对象名,如果存在也会解析该对象引用的对象是否存在。如果引用的对象名不存在,解析会在存储过程首次执行时触发。即在首次执行存储过程时,查询处理器从 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创建该存储过程时不会出错,但是执行存储过程时报错》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mybatis中的#与$的区别关于iOS6应用中第三方类库不支持armv7s的问题解决下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MYSQL学习笔记——连接以及存储过程

连接                                                                                                     当我们需要从多个表查询数据时,我们就需要使用到连接操作,mysql支持内连接,左连接以及右连接三种连接方式。 数据库准备       首先我们创建两个表...

oracle高级部分

回顾 多表关联查询的方式内连接 根据AB表关联的条件进行过滤查询,只保留满足条件数据 Select * from a,b where a.xxx=b.xxx;     Select * from a inner join b on a.xxx=b.xxxx     inner join c on a.xxxx=c.xxxx 外连接 左外连接 以左表为...

mysql 存储过程权限相关

1.修改mysql 存储过程的definer修改mysql.proc表 的definer字段   update mysql.proc set definer='root@%' where db='servant_591up'; UPDATE `mysql`.`proc` SET `definer`='root00@%' WHERE `db`='test'...

MySQL通过自定义函数以及存储过程实现递归查询父级ID

1.存储过程定义  存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译 2.为什么用存储过程实现树结构数据查询父级节点  1、能完成较复杂的运算与判断    2、可编程行强,灵活    3、SQL编程的代码可重复使用    4、预编译机制    5、减少...

oracle 存储过程(1)

--建一张user_info表create table user_info (id varchar2(10),name varchar2(20),password varchar2(20),address varchar2(30));--创建存储过程,作用是向user_info表中添加数据create or replace procedure adduse...

Sql中判断"数据库"、"表"、"临时表"、"存储过程"和列"是否存在

--判断数据库是否存在IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME = '库名')PRINT 'exists 'elsePRINT 'not exists' -- 判断要创建的表名是否存在IF EXISTS (Select * From sysObjects Where Name ='表名...