存储过程中可以使用alter table语句吗?

我写了一个存储过程,先建一张临时表temp_wlcrk,然后再用alter table语句添加一个字段dw_na,最后再写一个游标,从另外一张表iecusuh取数据写入dw_na字段里,当执行存储过程时,新增的字段并没有添加到temp_wlcrk里,提示dw_na无效列名,当然游标也就没能把数据添加进去,请大侠帮小弟看下,是什么原因,不胜感激,代码如下:
create proc pro_wlcrk2
@date1 datetime,
@date2 datetime
as
begin
drop table temp_wlcrk
end
select a.mt_code,b.class,a.mt_list ,a.mt_date,a.el_no ,c.el_name1,c.el_size,a.mt_qty,a.mt_qty1,a.mt_area,
d.mt_name,a.mt_seq,a.bin_no,a.su_no,a.sc_odno,a.mt_refr,a.lot_no,a.mt_sucu into temp_wlcrk from iemt03d1 a,
temp_mt_code b,ieel00h c,iepb07h d
where a.mt_code=b.code and a.el_no=c.el_no and a.mt_area=d.mt_area and
a.mt_date between @date1 and @date2

alter table temp_wlcrk add dw_na char(40)
update temp_wlcrk set dw_na=''
declare @cu_na1 char(60),@cu_no1 char(30)
declare cursor_wldw1 cursor for
select cu_no,cu_na from iecusuh
open cursor_wldw1
fetch next from cursor_wldw1 into @cu_no1,@cu_na1
while(@@fetch_status=0)
begin

update temp_wlcrk set dw_na=(
case
when su_no='' then ''
else
@cu_na1
end) where su_no=@cu_no1
fetch cursor_wldw1 into @cu_no1,@cu_na1
end
close cursor_wldw1
DEALLOCATE cursor_wldw1--释放游标 --select @cu_no1,@cu_na1
return
go
请大侠原谅,不是小弟不给分,只是小弟现在没有分了,恳请赐教,为盼,为感!
多谢这位兄弟帮忙,我用的是sqlserver2000的数据库,按兄弟刚说的方法改正了一下,还是不行,我做了一个简单的测试,依然运行不了:
create proc pro_addcolumn2
as
begin
create table ddd ( dd char(4),dd2 char(4) default 0)
insert into ddd(dd,dd2)values ('1','a')
insert into ddd(dd,dd2)values ('2','b')
insert into ddd(dd,dd2)values ('3','c')
alter table ddd add dd3 char(4)
update ddd set dd3=(
case
when dd='1' then 'e'
when dd='2' then 'f'
else 'g'
end)

end
go
最后执行并查询表:
exec pro_addcolumn2
select * from ddd
还是和以前一样的错误,大侠能再帮我看下嘛,多谢了

第1个回答  2009-11-06
看来你很少用sql啊~你这代码写得~~~先帮你找出几个最大的毛病吧:
1、create proc pro_wlcrk2
@date1 datetime,
@date2 datetime
as
begin
drop table temp_wlcrk
end你这里直接就end了那你过程不就到此结束了?把end移到倒数第二行去!
2、alter table temp_wlcrk add dw_na char(40) 你这里不用指定他为空不为空?
alter table temp_wlcrk add dw_na char(40) not null
3、fetch next from cursor_wldw1 into @cu_no1,@cu_na1 你确定游标的语法没问题?

补充:看来你真是刚用sql,一般涉及到对表结构的处理不提倡在过程中实现!至于你这个测试为啥不成功呢?你这么测试下看看有啥不一样:
create proc pro_addcolumn2
as
begin
if exists (select 1 from sysobjects where name = 'ddd')
drop table ddd
create table ddd ( dd char(4),dd2 char(4) default 0)
insert into ddd(dd,dd2)values ('1','a')
insert into ddd(dd,dd2)values ('2','b')
insert into ddd(dd,dd2)values ('3','c')
alter table ddd add dd3 char(4) null
select * from ddd
end
go
然后你分别执行:
exec pro_addcolumn2

select * from ddd
看看有啥不一样?
这也就是说你过程对表的字段处理当时是没效果的!!!本回答被提问者采纳