在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
答案 0 :(得分:1)
这不起作用。如果要添加列,那么insert语句中的select查询必须是动态的,因为它将继续添加列。
您也可以为insert和in select创建动态查询。 您还需要指定列名称 插入#TEP(col1,clo2,col3 ..)
如果您指定了requiremnet,可能有更好的方法。 游标和添加列不是很好的逻辑。
答案 1 :(得分:0)
这不会像你想要的那样有效。 SQL Server正在尝试尽早编译整个批处理 - 它会在insert
执行后编译create table
,此时表中有2列,但插入中有3列
但是,停下来再考虑一下 - 即使它第一次通过循环,下次循环时会发生什么?此时,表中有 4 列,但插入中只有3列。我不记得是否会完全失败,或只是插入你添加到表格中的第一个附加列,但不管怎样,我几乎可以肯定它不是你想要的。
看起来你正在尝试使用未知数量的列来进行某种形式的支点 - 关于这样做,有很多关于这样做的问题和答案。你必须沿着动态SQL的路线走下去(甚至超过你所尝试的那样),它永远不会漂亮。我几乎总是建议将一个正常的结果集(例如固定数量的列)返回到另一个系统(代码,报告生成器等),这更适合用格式化来进行那种混乱。
答案 2 :(得分:0)
我认为问题是你在每个循环上添加一个新列,但insert语句有一个静态列数。
答案 3 :(得分: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
答案 4 :(得分:0)
Declare @colname varchar(max)='col1,col2,col3',@sqlq varchar(max)=''
Declare @tblname varchar(max)='tbl1'
set @sqlq='Select '+@colname+' from table tbl_DefaultPermission '
EXECUTE (@sqlq)