2011-10-20 7 views
1

は、私は手順を書いて、私は1つのTEMテーブルとカーソルを使用して動的にその一時テーブルに1列を追加しますが、ERROを与えている:MS SQL ServerのTempテーブルに列を動的に追加しますか? SQL Serverでは

(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とselectの動的クエリを作成することができます。 あなたも(COL1、二酸化塩素、col3という。)#TEPに挿入 のような列名を指定する必要があります

あなたがそれらを指定した場合、あなたのrequiremnetのためのより良い方法があるかもしれません。 カーソルを追加して列を追加すると、適切なロジックが得られません。これは私がSQL SERVER 2008 R2を実行し、次のよあなたのためではなく、

働いていない理由を私は知らない

+0

OK私と正常に動作していますこのための良い解決策 –

0

これは動作しません。 SQL Serverは可能な限り早くバッチ全体をコンパイルしようとしています。create tableが実行された時点でinsertがコンパイルされます。そのとき、テーブルに2つの列がありますが、3つは挿入されます。

しかし、ループを最初にやったとしても、ループを次回はどうなりますか?その時点で、あなたのテーブルにはの列がありますが、挿入にはまだ3つしかありません。それが完全に失敗するかどうか、またはテーブルに追加した最初の追加の列に挿入するだけでは覚えていませんが、いずれにせよ、私はあなたが望むものではないことをほとんど確信しています。


あなたは、列の数が不明でピボットのいくつかのフォームをやろうとしているように見えます - SO上の質問と回答の多くがすでにあることやってあります。あなたは動的SQLのルートを下ろさなければなりません(あなたがしようとしたものよりもさらに)、決して美しいものではありません。私はほとんどの場合、通常の結果セット(例えば、固定数の列)を、書式設定に関するこのような操作を行うのに適した別のシステム(コード、レポートジェネレータなど)に戻すことをお勧めします。

0

私は、各ループに新しい列を追加していますが、挿入ステートメントには静的な列数があることが問題だと思います。

0

は何であるか、その後

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

関連する問題