一個不知可不可以實現的問題Create Table

时间:2021-04-05 16:05:09
想在存儲過程中創建這樣一個臨時表,表的字段個數是根據變量來決定的。
例如想創建臨時表#TT(Tid,T1,T2,T3....TN,TType)T1到TN是根據日期天數來決定N的大小。
如從@Bdate到@Edate是'2007/07/01'到'2007/07/05'則創建的表@TT(Tid,T1,T2,T3,T4,T5,TType)。
如果@Bdate到@Edate是'2007/07/01'到'2007/07/03'則創建的表@TT(Tid,T1,T2,T3,TType).
請指教,如果不行的話還有沒有辦法實現相同的效果.謝謝!!

9 个解决方案

#1


可以~~~
先计算出2个日期间的天数,
然后再拼成字符串如 set @sql = 'TD1 datetime,TD2 datetime'
然后连接set @sql = 'create #temp (' + @sql+ ')'

最后 exec (@sql)

#2


我可以用datediff(day,@Bdate,@Edate)得到天數@N。
問題是我應該怎麼拼成字符串@sql 

#3


declare @Bdate datetime ,@Edate datetime 
declare @Create varchar(1000),@Column varchar(4000),@sql varchar(8000)
declare @i int 
select @i = 1
select @create ='create table @tt
( Tid int ,' ,@column =''
select @bdate = '2007-07-01' ,@edate = '2007-07-10'
while(@i< datediff(day,@Bdate,@Edate) +1)
begin 
select @column =@column +'t'+cast(@i as varchar(10)) +' int ,' --这里的int 是类型,随你选了.
select @i =@i +1 
end 
select @column =@column + 'ttype int )'
select @sql = @create+ @column 
print @sql 
--exec(@sql )

create table @tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )

#4


上面错了...create table 不能使用 @ 这个只能是定义 :declare 
不过都差不多...

declare @Bdate datetime ,@Edate datetime
declare @Create varchar(1000),@Column varchar(4000),@sql varchar(8000)
declare @i int
select @i = 1
select @create ='declare @tt table 
( Tid int ,' ,@column =''
select @bdate = '2007-07-01' ,@edate = '2007-07-10'
while(@i< datediff(day,@Bdate,@Edate) +1)
begin
select @column =@column +'t'+cast(@i as varchar(10)) +' int ,' --这里的int 是类型,随你选了.
select @i =@i +1
end
select @column =@column + 'ttype int )'
select @sql = @create+ @column
print @sql
--exec(@sql )

#5


謝謝,我執行print @sql能得到下面的語句
create table @tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )
並且執行exec(@sql )也能成功。
但是在隨後我執行查詢select * from #tt
就提示"無效的物件名稱 '#tt'。"
請問是什麼原因啊。。。。

#6


謝謝,我執行print @sql能得到下面的語句
create table #tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )
並且執行exec(@sql )也能成功。
但是在隨後我執行查詢select * from #tt
就提示"無效的物件名稱 '#tt'。"
請問是什麼原因啊。。。。

單獨執行下面語句沒有問題,
create table #tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )
也能查詢select * from #tt

到底為什麼呢???


#7


作用域的問題,這裡創建的臨時表只在EXEC內部有效。

改為創建實體表吧,

改為

create table tt

#8


當然可以,請用動態存儲過程

#9


創建實體表,那不是每執行一次就創建一個TT表,隨後又再刪除
這個存儲過程可能會頻繁使用,會不會對數據庫有大的影響??

還有就是“動態存儲過程”是什麼意思啊??
謝謝大家

#1


可以~~~
先计算出2个日期间的天数,
然后再拼成字符串如 set @sql = 'TD1 datetime,TD2 datetime'
然后连接set @sql = 'create #temp (' + @sql+ ')'

最后 exec (@sql)

#2


我可以用datediff(day,@Bdate,@Edate)得到天數@N。
問題是我應該怎麼拼成字符串@sql 

#3


declare @Bdate datetime ,@Edate datetime 
declare @Create varchar(1000),@Column varchar(4000),@sql varchar(8000)
declare @i int 
select @i = 1
select @create ='create table @tt
( Tid int ,' ,@column =''
select @bdate = '2007-07-01' ,@edate = '2007-07-10'
while(@i< datediff(day,@Bdate,@Edate) +1)
begin 
select @column =@column +'t'+cast(@i as varchar(10)) +' int ,' --这里的int 是类型,随你选了.
select @i =@i +1 
end 
select @column =@column + 'ttype int )'
select @sql = @create+ @column 
print @sql 
--exec(@sql )

create table @tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )

#4


上面错了...create table 不能使用 @ 这个只能是定义 :declare 
不过都差不多...

declare @Bdate datetime ,@Edate datetime
declare @Create varchar(1000),@Column varchar(4000),@sql varchar(8000)
declare @i int
select @i = 1
select @create ='declare @tt table 
( Tid int ,' ,@column =''
select @bdate = '2007-07-01' ,@edate = '2007-07-10'
while(@i< datediff(day,@Bdate,@Edate) +1)
begin
select @column =@column +'t'+cast(@i as varchar(10)) +' int ,' --这里的int 是类型,随你选了.
select @i =@i +1
end
select @column =@column + 'ttype int )'
select @sql = @create+ @column
print @sql
--exec(@sql )

#5


謝謝,我執行print @sql能得到下面的語句
create table @tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )
並且執行exec(@sql )也能成功。
但是在隨後我執行查詢select * from #tt
就提示"無效的物件名稱 '#tt'。"
請問是什麼原因啊。。。。

#6


謝謝,我執行print @sql能得到下面的語句
create table #tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )
並且執行exec(@sql )也能成功。
但是在隨後我執行查詢select * from #tt
就提示"無效的物件名稱 '#tt'。"
請問是什麼原因啊。。。。

單獨執行下面語句沒有問題,
create table #tt
( Tid int ,t1 int ,t2 int ,t3 int ,t4 int ,t5 int ,t6 int ,t7 int ,t8 int ,t9 int ,ttype int )
也能查詢select * from #tt

到底為什麼呢???


#7


作用域的問題,這裡創建的臨時表只在EXEC內部有效。

改為創建實體表吧,

改為

create table tt

#8


當然可以,請用動態存儲過程

#9


創建實體表,那不是每執行一次就創建一個TT表,隨後又再刪除
這個存儲過程可能會頻繁使用,會不會對數據庫有大的影響??

還有就是“動態存儲過程”是什麼意思啊??
謝謝大家