无法删除存储过程中临时表的一列

kane 2003-10-19 01:32:12
给临时表动态增加列没有问题,但是删除一列时,发生错误,提示

列名 'LID' 无效。


存储过程如下:

ALTER PROCEDURE upLocationTextBookDetailByDate
(
@start datetime,
@end datetime
)
AS

CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 float NULL
)

Create Table #TextBookNumber
(
TextBookID int NOT NULL,
Num int NULL
)
--动态给临时表#TextBookNumber增加列
DECLARE @locationName varchar(60), @locationID int,@strsql varchar(100)

DECLARE location_cursor CURSOR FOR SELECT LocationName FROM LocationInfo

OPEN location_cursor

FETCH location_cursor INTO @locationName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('ALTER TABLE #LocationTextBookDetail ADD ' + @locationName + ' int NOT NULL DEFAULT (0)')
FETCH location_cursor INTO @locationName
END
CLOSE location_cursor
DEALLOCATE location_cursor
--end-----------
--修改临时表中数据
INSERT INTO #LocationTextBookDetail(LID, 教材编码, 教材名称, 单价) (SELECT TextBookID,TextBookNumber,TextBookName,
TextBookPrice FROM TextBook WHERE TextBookID IN (select distinct TextBookID from Plan_Course_TextBook where PC_ID IN
(select PC_ID from Plan_Course where
CourseID IN (select distinct CourseID from ElectiveCourse where
datediff(d,@start,ElectiveTime)>=0 and datediff(d,@end,ElectiveTime)<=0 and TextBookYN = 1))))

DECLARE location_cursor CURSOR FOR SELECT LocationName,LocationID FROM LocationInfo
OPEN location_cursor
FETCH location_cursor INTO @locationName, @locationID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #TextBookNumber EXEC upLocationGetTextBookByDate @locationID,@start,@end
SELECT @strsql = 'EXEC upLocationGetTextBook ' + CAST(@locationID AS varchar(2))
-- EXEC('UPDATE #LocationTextBookDetail SET ' + @locationName + '=A.NUM (' + @strsql +
-- ') AS A WHERE #LocationTextBookDetail.TextBookID = A.TextBookID')

EXEC('UPDATE #LocationTextBookDetail SET ' + @locationName + '=(SELECT NUM FROM #TextBookNumber
WHERE #LocationTextBookDetail.LID = #TextBookNumber.TextBookID) WHERE LID IN
(SELECT TextBookID FROM #TextBookNumber)')

FETCH location_cursor INTO @locationName, @locationID
DELETE #TextBookNumber
END
CLOSE location_cursor
DEALLOCATE location_cursor
--end--------------

--执行这句错误,没有这条语句执行正确
ALTER TABLE #LocationTextBookDetail DROP COLUMN LID

SELECT * FROM #LocationTextBookDetail

DROP TABLE #TextBookNumber
DROP TABLE #LocationTextBookDetail
...全文
117 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kane 2003-10-21
  • 打赏
  • 举报
回复
这个问题真是古怪,难道没有解决的方法吗
prcgolf 2003-10-21
  • 打赏
  • 举报
回复
大力的也有错误啊,
但错在何处不知??
下面可以,但在存储过程不行,因为存储过程中不能加GO。

CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 decimal(10,2) NULL
)

insert into #LocationTextBookDetail values(22,'001','235',232.22)
select * from #LocationTextBookDetail
exec('ALTER TABLE #LocationTextBookDetail DROP COLUMN LID ')
go
select * from #LocationTextBookDetail

drop table #LocationTextBookDetail
samuelpan 2003-10-21
  • 打赏
  • 举报
回复
插入错误: 列名或所提供值的数目与表定义不匹配。

请注意是插入错误 ,对数据库原理理解的人估计可以回答此问题
txlicenhe 2003-10-21
  • 打赏
  • 举报
回复
看不出什么问题。
kane 2003-10-21
  • 打赏
  • 举报
回复
问题解决了,在此感谢各位和一个在联想工作的同学。


最后的存储过程也如下:
ALTER PROCEDURE TEST2
AS

CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 decimal(10,2) NULL
)

insert into #LocationTextBookDetail values(22,'001','235',232.22)
select * from #LocationTextBookDetail
exec('ALTER TABLE #LocationTextBookDetail DROP COLUMN LID')

exec('select * from #LocationTextBookDetail')

drop table #LocationTextBookDetail
pengdali 2003-10-20
  • 打赏
  • 举报
回复
ALTER PROCEDURE TEST1
AS

CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 decimal(10,2) NULL
)

insert into #LocationTextBookDetail values(22,'001','235',232.22)
select * from #LocationTextBookDetail
exec('ALTER TABLE #LocationTextBookDetail DROP COLUMN LID')
select * from #LocationTextBookDetail

drop table #LocationTextBookDetail
kane 2003-10-20
  • 打赏
  • 举报
回复
to: welyngj(平平淡淡)

把你给sql语句加在一个存储过程里,
ALTER PROCEDURE TEST1
AS

CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 decimal(10,2) NULL
)

insert into #LocationTextBookDetail values(22,'001','235',232.22)
select * from #LocationTextBookDetail
ALTER TABLE #LocationTextBookDetail DROP COLUMN LID
select * from #LocationTextBookDetail

drop table #LocationTextBookDetail

语法检查正确,但执行也错误

(所影响的行数为 1 行)


(所影响的行数为 1 行)

服务器: 消息 213,级别 16,状态 5,过程 TEST1,行 13
插入错误: 列名或所提供值的数目与表定义不匹配。
存储过程: BBIMDEDU.dbo.TEST1
kane 2003-10-20
  • 打赏
  • 举报
回复
to:CrazyFor(吃素的鼹鼠)

我的存储过程中写的是
CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 float NULL
)

##LocationTextBookDetail是welyngj(平平淡淡)给的实例中用到的
CrazyFor 2003-10-19
  • 打赏
  • 举报
回复
你建的是:##LocationTextBookDetail

而不是#LocationTextBookDetail
kane 2003-10-19
  • 打赏
  • 举报
回复
现在好像是只有#LocationTextBookDetail表中有数据,就无法删除一列,请各位帮忙
kane 2003-10-19
  • 打赏
  • 举报
回复
to: welyngj(平平淡淡)

你的代码执行确实没有问题。但是我的存储过程执行到
ALTER TABLE #LocationTextBookDetail DROP COLUMN LID
仍说列名 'LID' 无效

如果注释掉中间插入数据的语句,就正确,但是用
insert into #LocationTextBookDetail values(22,'001','234',22.22)
插入一条语句后,同样会出错
welyngj 2003-10-19
  • 打赏
  • 举报
回复
drop table ##LocationTextBookDetail

CREATE TABLE ##LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 decimal(4,2) NULL
)

insert into ##LocationTextBookDetail values(22,'001','234',22.22)
select * from ##LocationTextBookDetail
ALTER TABLE ##LocationTextBookDetail DROP COLUMN LID
select * from ##LocationTextBookDetail
kane 2003-10-19
  • 打赏
  • 举报
回复
把上面的放到查询分析器执行,结果:



(所影响的行数为 1 行)


(所影响的行数为 1 行)

服务器: 消息 213,级别 16,状态 5,行 9
插入错误: 列名或所提供值的数目与表定义不匹配。
wzh1215 2003-10-19
  • 打赏
  • 举报
回复

CREATE TABLE #LocationTextBookDetail
(
LID int NULL,
教材编码 varchar(60) NULL,
教材名称 varchar(60) NULL,
单价 float NULL
)

insert into #LocationTextBookDetail values(22,'001','234',22.22)

select * from #LocationTextBookDetail

ALTER TABLE #LocationTextBookDetail DROP COLUMN LID
select * from #LocationTextBookDetail

执行结果为:

LID 教材编码 教材名称 单价
----------- -------------------------------------------------------
22 001 234 22.219999999999999

(1 row(s) affected)

教材编码 教材名称 单价
---------------------------------------------------------------
001 234 22.219999999999999

(1 row(s) affected)

这样执行的结果没有问题呀
kane 2003-10-19
  • 打赏
  • 举报
回复
望高手帮忙
为什么要学习这门课程?·新一代流式数据湖技术组件深入讲解,帮助你快速构造数据湖知识体系。·为构建湖仓一体架构提供底层技术支撑。本课程将从原理、架构、底层存储细节、性能优化、管理等层面对Paimon流式数据湖组件进行详细讲解,原理+实战,帮助你快速上手使用数据湖技术。讲师介绍华为HCIP认证大数据高级工程师北京猎豹移动大数据技术专家科院大数据研究院大数据技术专家51CTO企业IT学院优秀讲师电子工业出版社2022年度优秀作者出版书籍:《Flink入门与实战》、《大数据技术及架构图解实战派》。本课程提供配套课件、软件、试题、以及源码。课程内容介绍:1、什么是Apache Paimon2、Paimon的整体架构3、Paimon的核心特点4、Paimon支持的生态5、基于Flink SQL操作Paimon6、基于Flink DataStream API 操作Paimon7、Paimon的内部表和外部表8、Paimon的分区表和临时表9、Paimon的Primary Key表(主键表)10、Paimon的Append Only表(仅追加表)11、Changelog Producers原理及案例实战12、Merge Engines原理及案例实战13、Paimon的Catalog详解14、Paimon的Table详解15、Paimon之Hive Catalog的使用16、动态修改Paimon表属性17、查询Paimon系统表18、批量读取Paimon表19、流式读取Paimon表20、流式读取高级特性Consumer ID21、Paimon CDC数据摄取功能22、CDC之MySQL数据同步到Paimon23、CDC之Kafka数据同步到Paimon24、CDC高级特性之Schema模式演变25、CDC高级特性之计算列26、CDC高级特性之特殊的数据类型映射27、CDC高级特性之文乱码28、Hive引擎集成Paimon29、在Hive配置Paimon依赖30、在Hive读写Paimon表31、在Hive创建Paimon表32、Hive和Paimon数据类型映射关系33、Paimon底层文件基本概念34、Paimon底层文件布局35、Paimon底层文件操作详解36、Flink流式写入Paimon表过程分析37、读写性能优化详细分析38、Paimon快照、分区、小文件的管理39、管理标签(自动管理+手工管理)40、管理Bucket(创建+删除+回滚)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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