求一个自动添加列的存储过程!!

a511900703 2010-07-20 09:46:45

我要根据传递的两个时间 StartTime,endTime 来判断要添加几列,临时表已经创建好了。如果这两个日期相差一个月就添加一列,2个月就添加2列,各位 最好是源代码。谢谢,因为本人没写过存储过程。!!!!
...全文
170 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
a511900703 2010-07-20
  • 打赏
  • 举报
回复
我想到了,我是想根据传递的时间来判断添加几列, 再把在别的表中查询出来的sql添加到临时表中。 最好到程序调用,怎么弄啊! 救命啊!!
a511900703 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 beirut 的回复:]
SQL code
create table tb(id int)
declare @n int,@m int,@StartTime datetime,@endTime datetime,@sql varchar(1000)
set @n=1
set @StartTime='2010-05-05'
set @endTime = '2010-07-06'
set @m = datedif……
[/Quote]

你这个,我要一起得到年和月做列名,怎么弄? 比方说 201005 201006 201007 这样的
dla001 2010-07-20
  • 打赏
  • 举报
回复
这东西有意思,哈哈。收藏先
feixianxxx 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wufeng4552 的回复:]

引用 9 楼 beirut 的回复:
[Quote=引用 8 楼 wufeng4552 的回复:]
引用 4 楼 beirut 的回复:
ltrim 放在exec()內部也是不可行的
SQL code
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exe……
[/Quote]
...
a511900703 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shmilywcd 的回复:]
SQL code

alter procedure Pr_GetTab
@st datetime,
@et datetime
as
begin
declare @sm tinyint,
@em tinyint,
@str varchar(4000)
if @et<= @st
begin……
[/Quote]


我要在中间加查询语句,要加到哪里啊? 就是在查询出来的DataSet后面要添加列。
黄_瓜 2010-07-20
  • 打赏
  • 举报
回复
create table tb(id int)
declare @n int,@m int,@StartTime datetime,@endTime datetime,@sql varchar(1000)
set @n=1
set @StartTime='2010-05-05'
set @endTime = '2010-07-06'
set @m = datediff(mm,@StartTime,@endTime)
set @sql=''
while @n<=@m
begin
set @sql= @sql+'alter table tb add ['+ltrim(@n)+'] int'+char(13)
set @n=@n+1
end
print @sql
exec(@sql)
go
select * from tb


drop table tb
黄_瓜 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beirut 的回复:]
SQL code
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec('alter table tb add ltrim('+@n+') int')
set @n=@n+1
go
[/Quote]shi bai
a511900703 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shmilywcd 的回复:]
SQL code

alter procedure Pr_GetTab
@st datetime,
@et datetime
as
begin
declare @sm tinyint,
@em tinyint,
@str varchar(4000)
if @et<= @st
begin……
[/Quote]
加点注释上去,谢谢
a511900703 2010-07-20
  • 打赏
  • 举报
回复
大哥们! 有不有完整的,你们写的这些,我看不大懂!我是菜鸟!
天-笑 2010-07-20
  • 打赏
  • 举报
回复

alter procedure Pr_GetTab
@st datetime,
@et datetime
as
begin
declare @sm tinyint,
@em tinyint,
@str varchar(4000)
if @et<= @st
begin
raiserror('开始时间大于结束时间', 16, 1)
return -1
end

create table #tmp
(ID int primary key)

set @sm = month(@st)
set @em = month(@et)

while @em>@sm
begin
set @str = 'alter table #tmp add m' + convert(varchar(2),@sm) + ' int null'
print @str
exec (@str)
set @sm = @sm + 1
end
select * from #tmp
drop table #tmp
end

--exec Pr_GetTab '2010-01-01' ,'2010-07-01'
alter table #tmp add m1 int null
alter table #tmp add m2 int null
alter table #tmp add m3 int null
alter table #tmp add m4 int null
alter table #tmp add m5 int null
alter table #tmp add m6 int null
ID m1 m2 m3 m4 m5 m6
----------- ----------- ----------- ----------- ----------- ----------- -----------

(0 行受影响)

水族杰纶 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 beirut 的回复:]
[Quote=引用 8 楼 wufeng4552 的回复:]
引用 4 楼 beirut 的回复:
ltrim 放在exec()內部也是不可行的
SQL code
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec(alter table tb addltrim('+@n+') int')
set ……
[/Quote]
ltrim 放在exec()內部也是不可行的
-- 錯誤的寫法
declare @n int
set @n=1
exec('select '+ltrim(@n))
/*
消息 102,级别 15,状态 1,第 3 行
'ltrim' 附近有语法错误。

*/
go
--正確的寫法
declare @n int,@sql varchar(1000)
set @n=1
set @sql='select '+ltrim(@n)
exec(@sql)
rmljoe 2010-07-20
  • 打赏
  • 举报
回复
declare @starttime smalldatetime
declare @endtime smalldatetime
set @starttime = '2009-01-05'
set @endtime = '2009-08-03'

declare @sql varchar(8000)

select
@sql = isnull(@sql,'') + ',[' + convert(varchar(7),dateadd(mm,number,@starttime),120) + '] int'
from master..spt_values
where type = 'p' and number <= datediff(mm,@starttime,@endtime)

set @sql = 'if object_id(''tempdb..##temp'') is not null drop table ##temp create table ##temp (id int ' + @sql + ')'
--print @sql
exec(@sql)

/*
select * from ##temp


id 2009-01 2009-02 2009-03 2009-04 2009-05 2009-06 2009-07 2009-08
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------

(0 行受影响)
*/
黄_瓜 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wufeng4552 的回复:]
引用 4 楼 beirut 的回复:
SQL code
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec(alter table tb addltrim('+@n+') int')
set @n=@n+1
go

点错位置了
没开sql 一片黑的 手误



declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec('alter table tb add '+ltrim(@n)+' int')
set @n=@n+1
go


ltrim 放在exec()內部也……
[/Quote]
黄_瓜 2010-07-20
  • 打赏
  • 举报
回复
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec('alter table tb add ltrim('+@n+') int')
set @n=@n+1
go
水族杰纶 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beirut 的回复:]
SQL code
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec(alter table tb addltrim('+@n+') int')
set @n=@n+1
go
[/Quote]
ltrim 放在exec()內部也是不可行的
黄_瓜 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beirut 的回复:]
SQL code
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec(alter table tb addltrim('+@n+') int')
set @n=@n+1
go
[/Quote]少个‘
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec('alter table tb addltrim('+@n+') int')
set @n=@n+1
go
黄_瓜 2010-07-20
  • 打赏
  • 举报
回复
declare @n int,@m int
set @m = datediff(mm,@StartTime,@endTime)
set @n=1
while @n<=@m
exec(alter table tb addltrim('+@n+') int')
set @n=@n+1
go
华夏小卒 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wufeng4552 的回复:]
引用 1 楼 js_szy 的回复:
SQL code
set @m = datediff(month,@StartTime,@endTime)

set n=1
while n<=@m
alter table tb add 'N'+ltrim(n) int

go

貌似還是死循環
[/Quote]
哦,是死循环,忘记加N=n+1 ;
水族杰纶 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 js_szy 的回复:]
SQL code
set @m = datediff(month,@StartTime,@endTime)

set n=1
while n<=@m
alter table tb add 'N'+ltrim(n) int

go
[/Quote]
貌似還是死循環
水族杰纶 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 js_szy 的回复:]
SQL code
set @m = datediff(month,@StartTime,@endTime)

set n=1
while n<=@m
alter table tb add 'N'+ltrim(n) int

go
[/Quote]
卒子要改成動態
加载更多回复(1)

34,576

社区成员

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

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