Sql server 在Ms Sql Server的临时表中动态添加列?

Sql server 在Ms Sql Server的临时表中动态添加列?,sql-server,Sql Server,在Sql server中,我编写了一个过程,使用了一个tem表和一个游标,并向该临时表动态添加了一列,但它给出了erro: (10 row(s) affected) Msg 213, Level 16, State 1, Procedure USP_F_Roll_AllIndia_Report, Line 27 Column name or number of supplied values does not match table definition. 这是我的程序: alter proc

在Sql server中,我编写了一个过程,使用了一个tem表和一个游标,并向该临时表动态添加了一列,但它给出了erro:

(10 row(s) affected)
Msg 213, Level 16, State 1, Procedure USP_F_Roll_AllIndia_Report, Line 27
Column name or number of supplied values does not match table definition.
这是我的程序:

alter procedure USP_F_Roll_AllIndia_Report       
(@segcode int,@rollplanyear int)
as
 begin
declare @cfcode varchar(10)
declare @cfname varchar(30)
declare @SQl nvarchar(max)  

create table #TEP (productcode varchar(10) collate database_default,proddesc varchar(100))

declare db_cursor cursor for   

select distinct canfm.CFCode, SUBSTRING (CANFM.CFName,4,5)as CFName   from Tbl_F_CandF_M CANFM left outer join   Tbl_F_Org_CandF_T CT  on  CANFM.CFCode = ct.CFCode where  CANFM .status =1 and ct.Status =1 order by canfm.cfcode   

open db_cursor 

fetch next from db_cursor into @cfcode, @cfname

while @@FETCH_STATUS =0
  begin

    set @SQL ='alter table #TEP add '+@cfname+' float'  
    exec sp_executesql @Sql
    --exec  ( @Sql)


    insert into #TEP 

    select pd.productcode,PM.productdesc,convert(varchar,sum(isnull(AmendedQty,isnull(Quantity,0))))as quantity    from Tbl_F_Roll_PlanDetails_T pd left outer join Tbl_F_ProductMaster_M PM on
    pd.ProductCode =pm.ProductCode left outer join Tbl_F_CandF_M CANDF on pd.CandFLocation =CANDF.CFCode    where pd. RollPlanYear =@rollplanyear and pd.CandFLocation =@cfcode  and  pd.ProductCode in (
    select ProductCode  from   Tbl_F_Segment_Product_t where SegCode  =@segcode )    group by pd.ProductCode,pm.ProductDesc  

   fetch next from db_cursor into @cfcode, @cfname
 end              
     close db_cursor              
     deallocate db_cursor                                             
     select * from #TEP               
 end  

这将无法像您尝试的那样工作。SQL Server正在尽可能早地编译整个批处理—一旦执行了
create table
,它将编译
insert
,此时,表中有2列,但insert中有3列

但是,停下来进一步思考——即使它第一次在循环中起作用,下一次在循环中会发生什么?此时,表中有4列,但insert中仍然只有3列。我不记得这是否会完全失败,或者只是插入到您添加到表中的第一个附加列中,但不管怎样,我几乎可以肯定这不是您想要的



看起来您正在尝试使用未知数量的列进行某种形式的透视-关于如何进行透视,已经有很多问题和答案了。您必须遵循动态SQL的路线(甚至比您所尝试的还要多),而且它从来都不漂亮。我几乎总是建议将一个正常的结果集(例如,固定数量的列)返回到另一个系统(代码、报表生成器等),这更适合于进行这种格式化操作。

这不会像您尝试的那样起作用。SQL Server正在尽可能早地编译整个批处理—一旦执行了
create table
,它将编译
insert
,此时,表中有2列,但insert中有3列

但是,停下来进一步思考——即使它第一次在循环中起作用,下一次在循环中会发生什么?此时,表中有4列,但insert中仍然只有3列。我不记得这是否会完全失败,或者只是插入到您添加到表中的第一个附加列中,但不管怎样,我几乎可以肯定这不是您想要的



看起来您正在尝试使用未知数量的列进行某种形式的透视-关于如何进行透视,已经有很多问题和答案了。您必须遵循动态SQL的路线(甚至比您所尝试的还要多),而且它从来都不漂亮。我几乎总是建议将一个正常的结果集(例如,固定数量的列)返回到另一个系统(代码、报表生成器等),这更适合进行这种格式化操作。

我认为问题在于,您在每个循环中添加了一个新列,但是insert语句有一个静态的列数。

我认为问题在于您在每个循环上添加了一个新列,但是insert语句有一个静态的列数。

这不起作用。若要添加列,那个么insert语句中的select查询必须是动态查询,因为它将继续添加列

您还可以为insert和in select创建动态查询。 您还需要指定列名称,如 插入到#TEP中(col1、COL2、col3.)

如果您指定了requiremnet,可能会有更好的方法。
游标和添加列的逻辑不好。

这将不起作用。若要添加列,那个么insert语句中的select查询必须是动态查询,因为它将继续添加列

您还可以为insert和in select创建动态查询。 您还需要指定列名称,如 插入到#TEP中(col1、COL2、col3.)

如果您指定了requiremnet,可能会有更好的方法。
游标和添加列的逻辑不好。

我不知道为什么这对您不起作用,但是

我正在运行
SQLServer2008R2
,下面的内容对我来说很好

 CREATE TABLE #temp (ID int) 
 DECLARE @Sql as varchar(250) 
 DECLARE @colName varchar(50)
  SET @colName  = 'name'
  SET @Sql = 'ALTER TABLE #temp ADD [' + @colName + '] VARCHAR(50)'
  EXEC (@Sql)
  SELECT * FROM #temp 
 DROP TABLE #temp

我不知道为什么这对你不起作用,但是

我正在运行
SQLServer2008R2
,下面的内容对我来说很好

 CREATE TABLE #temp (ID int) 
 DECLARE @Sql as varchar(250) 
 DECLARE @colName varchar(50)
  SET @colName  = 'name'
  SET @Sql = 'ALTER TABLE #temp ADD [' + @colName + '] VARCHAR(50)'
  EXEC (@Sql)
  SELECT * FROM #temp 
 DROP TABLE #temp

这里不欢迎没有任何解释的发布代码。请把你的帖子发出来好吗?这里不欢迎没有任何解释的帖子代码。请把你的信寄出去好吗?