2011-10-20 36 views
1

在SQL Server中,我寫了一個程序,我用一個TEM表,遊標和動態一列添加到臨時表,但它給埃羅:在Ms Sql Server的Temp表中動態添加列?

(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. 

這是我的PROC:

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 '[email protected]+' 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 [email protected] and pd.CandFLocation [email protected] and pd.ProductCode in (
    select ProductCode from Tbl_F_Segment_Product_t where SegCode [email protected]) 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 

回答

1

這不起作用。如果要添加列,那麼在插入語句中的選擇查詢必須是動態的,因爲它將繼續添加列。

您可以創建一個動態查詢插入和選擇以及。 您還需要指定列的名字,如 INSERT INTO #TEP(COL1,二氧化氯,COL3 ..)

如果你指定他們有可能是更好的方式爲您requiremnet。遊標和添加列不是很好的邏輯。

+0

OK又是什麼這是很好的解決方案 –

0

這不會像你想要的那樣工作。 SQL Server試圖儘可能早地編譯整個批處理 - 一旦你的create table執行完畢,它就會編譯insert,那時表中有2列,而在插入中有3列。

但是,停下來再想一想 - 即使它是第一次通過循環工作,下一次通過循環會發生什麼?此時,表中有列,但插入中仍然只有3列。我不記得這是否會完全失敗,或者只是插入到已添加到表格中的第一個附加列中,但無論如何,我幾乎可以確定這不是您想要的。


它看起來就像你正在試圖做某種形式的支點與未知數量的列 - 有大量的問題和答案在SO這樣做已經。你必須走動態SQL的路線(甚至比你嘗試的更多),它永遠不會很漂亮。我幾乎總是建議將正常結果集(例如固定列數)返回到另一個系統(代碼,報告生成器等),它更適合於進行這種格式化。

0

我認爲問題在於你要在每個循環中添加一個新列,但是insert語句有一個靜態數量的列。

0

我不知道這是爲什麼不爲你工作,但

我跑SQL SERVER 2008 R2和下面是我工作的罰款

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 

SQL Fiddle