存储过程执行顺序问题

oceanmeng 2016-10-20 12:51:33
我发现我的存储过程在exec AutoInsert执行时最后一步抱错“sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。 ”,进一步看是alter修改字段类型为int没有执行导致的,很奇怪,为何没有执行呢?
我把存储过程所有语句单独copy到查询分析器里面就可以全部按顺序执行,那为何存储过程不行?

CREATE PROCEDURE [dbo].[AutoInsert] AS

SET ANSI_Nulls ON
SET ANSI_WARNINGS ON

drop table BIFS_ATM_INFO;
select * into BIFS_ATM_INFO from ATM_DEV_INFO

drop table BIFS_POS_INFO;
select * into BIFS_POS_INFO from POS_DEV_INFO

ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_NUMS int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_CWD int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_CDM int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_CWD_CDM int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_Bank int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_Space int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_Wall int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_Hall int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_City int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_Rural int;
ALTER TABLE BIFS_POS_INFO ALTER COLUMN POS_NUMS int;

exec sp_refreshview V_BIFS_ATM_INFO;
exec sp_refreshview V_BIFS_POS_INFO;

drop table BIFS_POS_INFO_GROUP;
select isnull(POSTYPE,'空')POSTYPE,BrandNAME,ModelNAME,sum(POS_NUMS)POS_NUMS,count(distinct CURR_soft_version) AS Soft_Vers,
dbo.FUNC_POSVerInfo(isnull(BrandNAME,'空'),isnull(ModelNAME,'空'),isnull(POSTYPE,'空')) AS POSVerInfo into BIFS_POS_INFO_GROUP
from BIFS_POS_INFO where Last_Logon='2016'
group by POSTYPE,BrandNAME,ModelNAME order by POSTYPE,BrandNAME,POS_NUMS desc;
GO

...全文
584 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-10-20
  • 打赏
  • 举报
回复
引用 8 楼 oceanmeng 的回复:
为何存储过程执行会有跳过某些脚本呢
T-SQL 首先会通过数据库引擎 检查语句(语法错误)-》生成执行计划-》 执行计划 你检查语句都不通过,后面的是执行不了的 用动态语句会忽略语法检查
oceanmeng 2016-10-20
  • 打赏
  • 举报
回复
为何存储过程执行会有跳过某些脚本呢
  • 打赏
  • 举报
回复
我用临时表的时候 ,存储过程中间用alter 加了 一个字段,后面select 临时表时 ,发现 没有加上那个字段
中国风 2016-10-20
  • 打赏
  • 举报
回复
查看要用动态

CREATE PROCEDURE [dbo].[AutoInsert] AS

SET ANSI_Nulls ON
SET ANSI_WARNINGS ON

drop table BIFS_ATM_INFO;
select * into BIFS_ATM_INFO from  ATM_DEV_INFO 

drop table BIFS_POS_INFO;
select * into BIFS_POS_INFO from POS_DEV_INFO

ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_NUMS int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_CWD int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_CDM int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_CWD_CDM int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_Bank int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_Space int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_Wall int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_Hall int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_City int;
ALTER TABLE BIFS_ATM_INFO ALTER COLUMN  ATM_Rural int;
ALTER TABLE BIFS_POS_INFO ALTER COLUMN  POS_NUMS int;

exec sp_refreshview V_BIFS_ATM_INFO;
exec sp_refreshview V_BIFS_POS_INFO;

drop table BIFS_POS_INFO_GROUP;
EXEC('select isnull(POSTYPE,''空'')POSTYPE,BrandNAME,ModelNAME,sum(POS_NUMS)POS_NUMS,count(distinct CURR_soft_version) AS Soft_Vers,
dbo.FUNC_POSVerInfo(isnull(BrandNAME,''空''),isnull(ModelNAME,''空''),isnull(POSTYPE,''空''))  AS POSVerInfo into BIFS_POS_INFO_GROUP
from  BIFS_POS_INFO where Last_Logon=''2016''
group by POSTYPE,BrandNAME,ModelNAME order by  POSTYPE,BrandNAME,POS_NUMS desc;')
GO

中国风 2016-10-20
  • 打赏
  • 举报
回复
语句不够简洁改 这样用,不用分多段 ALTER TABLE BIFS_ATM_INFO ALTER COLUMN ATM_NUMS INT,ATM_CWD int.....
oceanmeng 2016-10-20
  • 打赏
  • 举报
回复
sql server 2000
  • 打赏
  • 举报
回复
数据库啥版本的?
道素 2016-10-20
  • 打赏
  • 举报
回复
没有重现这个问题 你可以在创建BIFS_POS_INFO时直接创建正确的类型,如:

select *
,CONVERT(INT,POS_NUMS) AS POS_NUMS_INT
into BIFS_POS_INFO 
from POS_DEV_INFO
卖水果的net 版主 2016-10-20
  • 打赏
  • 举报
回复
全部换成动态语句试试;

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧