创建临时表报错,求修正,立结贴

霜寒月冷 2013-12-31 01:30:08

Alter procedure createdatelog

as
begin
create table #tb_kaoqin(userid nvarchar(50),username nvarchar(50))

declare @starttime datetime
declare @endtime datetime
declare @settime datetime
declare @sql varchar(100)
set @starttime='2014-01-01'
set @settime='2014-01-01'
set @endtime='2014-12-31'
while @starttime <@endtime
begin
if @settime>=@endtime
return
set @settime=dateadd(dd,1,@settime)
set @sql='alter table #tb_kaoqin add ['+ Convert(varchar(10), @settime,120)+'] nvarchar(10)'
print @sql
exec (@sql)
select * from #tb_kaoqin
end

end
go
exec createdatelog


(0 行受影响)
alter table #tb_kaoqin add [2014-04-14] nvarchar(10)

(0 行受影响)
alter table #tb_kaoqin add [2014-04-15] nvarchar(10)

(0 行受影响)
alter table #tb_kaoqin add [2014-04-16] nvarchar(10)

(0 行受影响)
alter table #tb_kaoqin add [2014-04-17] nvarchar(10)

(0 行受影响)
alter table #tb_kaoqin add [2014-04-18] nvarchar(10)
在执行批处理时出现错误。错误消息为: 引发类型为“System.OutOfMemoryException”的异常。


...全文
200 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
没现成代码,没必要的话我也不想写
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
那别搞那么麻烦了,就这样做吧。反正一年的数据也不多,而且也就建一次。
霜寒月冷 2013-12-31
  • 打赏
  • 举报
回复
引用 18 楼 DBA_Huangzj 的回复:
问题是你这个是临时表,执行完就消失了,还怎么存放数据呢?
刚刚建的只是为了测试,用的时候还是建实体表的。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
问题是你这个是临时表,执行完就消失了,还怎么存放数据呢?
霜寒月冷 2013-12-31
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
另外真要这样做也不用循环啊
有更优的方法建表,辛苦版版贴一下。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
另外真要这样做也不用循环啊
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
哥,那你先建好一个年份表啊,别动态生成
引用 13 楼 chz415767975 的回复:
引用 9 楼 DBA_Huangzj 的回复:
你要加365列?
嗯,客户反应一个查询统计慢,我现在想到办法就是把每天的汇总数据保存到这张表里面,来处理频繁的查询
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
你把print去掉试试
霜寒月冷 2013-12-31
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
你要加365列?
嗯,客户反应一个查询统计慢,我现在想到办法就是把每天的汇总数据保存到这张表里面,来处理频繁的查询
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
不过我这里执行成功了,你的tempdb有限制?
ALTER procedure createdatelog
 
as
begin
create table #tb_kaoqin(userid nvarchar(50),username nvarchar(50))
 
declare @starttime datetime
declare @endtime datetime
declare @settime datetime
declare @sql varchar(100)
set @starttime='2014-01-01'
set @settime='2014-01-01'
set @endtime='2014-12-31'
while @starttime <@endtime 
begin
if @settime>=@endtime 
return 
set @settime=dateadd(dd,1,@settime)
set @sql='alter table #tb_kaoqin add ['+ Convert(varchar(10), @settime,120)+'] nvarchar(10)'
print @sql
exec (@sql)
select * from  #tb_kaoqin
end
 
end
go
exec createdatelog
山寨DBA 2013-12-31
  • 打赏
  • 举报
回复
刚没仔细看,你的循环是死循环,改这样:

alter procedure createdatelog

as
set nocount on
begin
	create table #tb_kaoqin(userid nvarchar(50),username nvarchar(50))
	 
	declare @starttime datetime
	declare @endtime datetime
	declare @settime datetime
	declare @sql varchar(100)
	set @starttime='2014-01-01'
	set @settime='2014-01-01'
	set @endtime='2014-12-31'

	while @starttime <@endtime 
	begin
		if @settime>=@endtime 
			return 
			
		set @settime=dateadd(dd,1,@settime)
		set @sql='alter table #tb_kaoqin add ['+ Convert(varchar(10), @settime,120)+'] nvarchar(10)'
		print @sql
		exec (@sql)
		set @starttime=dateadd(dd,1,@starttime)----添加这句话
		select * from  #tb_kaoqin
	end
	
end
go
exec createdatelog
霜寒月冷 2013-12-31
  • 打赏
  • 举报
回复
找到正解

alter procedure createdatelog

as
begin
create table #tb_kaoqin(userid nvarchar(50),username nvarchar(50))

declare @starttime datetime
declare @endtime datetime
declare @settime datetime
declare @sql varchar(100)
set @starttime='2014-01-01'
set @settime='2014-01-01'
set @endtime='2014-12-31'
while @settime <@endtime 
begin
--if @settime>=@endtime 
--return 
set @settime=dateadd(dd,1,@settime)
set @sql='alter table #tb_kaoqin add ['+ Convert(varchar(10), @settime,120)+'] nvarchar(10)'
print @sql
exec (@sql)


end
select * from  #tb_kaoqin
end
go
exec createdatelog
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
你要加365列?
KeepSayingNo 2013-12-31
  • 打赏
  • 举报
回复
在你存储过程的21行后面加上下面一句

set @starttime= dateadd(d,1,@starttime)
exception92 2013-12-31
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
循环条件错了,我这里一直在加日期
最后: alter table #tb_kaoqin add [2014-12-29] nvarchar(10) 警告: 已经创建表 '#tb_kaoqin',但是它的最大行大小超过了允许的最大字节数 8060。如果得到的行超过此大小限制,则对此表的 INSERT 或 UPDATE 操作将失败。
霜寒月冷 2013-12-31
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
循环条件错了,我这里一直在加日期
帮我修正正确,谢谢。
LongRui888 2013-12-31
  • 打赏
  • 举报
回复
改成这样试试:

create procedure createdatelog

as
begin
create table #tb_kaoqin(userid nvarchar(50),username nvarchar(50))

declare @starttime datetime
declare @endtime datetime
declare @settime datetime
declare @sql varchar(100)
set @starttime='2014-01-01'
set @settime='2014-01-01'
set @endtime='2014-12-31'
while @settime <@endtime 
begin
--if @settime>=@endtime 
--return 
set @settime=dateadd(dd,1,@settime)
set @sql='alter table #tb_kaoqin add ['+ Convert(varchar(10), @settime,120)+'] nvarchar(10)'
print @sql
exec (@sql)
select * from  #tb_kaoqin

end

end
go
exec createdatelog
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
循环条件错了,我这里一直在加日期
霜寒月冷 2013-12-31
  • 打赏
  • 举报
回复
引用 1 楼 hwhmh2010 的回复:
你那是多少的SQL 版本,我在我自己电脑上执行可以的呢。不会报错,我的版本是08R2

铁歌 2013-12-31
  • 打赏
  • 举报
回复
@starttime 没有任何变化,死循环耗尽Memory, 引发 “System.OutOfMemoryException”的异常。
加载更多回复(1)

34,594

社区成员

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

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