动态添加列到temptable?

时间:2011-12-14 08:55:43

标签: sql-server

在我的sqluery中,我试图动态添加列,但它显示错误像: 消息214,级别16,状态2,过程sp_executesql,第1行 过程需要'ntext / nchar / nvarchar'类型的参数'@statement'。  这是我的过程

        declare @curntyear int
           declare @pasyear int
           declare @sql nvarchar(max)
           declare @temp varchar(50)                
            select  @pasyear=YEAR( DATEADD (YEAR,-3,GETDATE ()))
            select @curntyear =YEAR (getdate())
            print @pasyear
            print @curntyear               
             create table #TempTable (years varchar(30))
             insert into #TempTable  select (cargo+port+railway+estate)as 'sum' from operatingincome where YEAR(createddate)=@pasyear                   
           while (@curntyear >=@pasyear )
            begin
               set @pasyear =@pasyear +1
               --select @temp=(cargo+port+railway+estate)as 'sum' from operatingincome where YEAR(createddate)=@pasyear 
               select  @temp= convert(varchar,(cargo+port+railway+estate),106)   from operatingincome where YEAR(createddate)= @pasyear
               set @sql ='alter table #TempTable add '+ CONVERT(varchar,@pasyear,106)+' varchar(50)'        

                  exec sp_executesql @sql 
                   print @sql
                                           set @sql = 'update #TempTable set '+CONVERT(varchar,@pasyear,106) +'='+@temp +' where years='''+CONVERT(varchar,@pasyear,106)+''
                      exec sp_executesql @sql 
               set @temp =''
              end
              select * from #TempTable     

我收到这样的错误:

Msg 102,Level 15,State 1,Line 1 '2009'附近的语法不正确。 Msg 102,Level 15,State 1,Line 1 '2010'附近的语法不正确。 alter table #TempTable add 2010 varchar(50) 更新#TempTable set 2010 = 9300 where years = 2010

2 个答案:

答案 0 :(得分:0)

更改

declare @sql varchar(max)

declare @sql nvarchar(max)

您会在错误消息中和MSDN(我的粗体)

上告诉您
  

[@ statement =]声明

     

Unicode 字符串,其中包含Transact-SQL语句或批处理。语句必须是 Unicode 常量或 Unicode 变量。

答案 1 :(得分:0)

听起来你正在使用VARCHAR语句调用sp_executesql,当它需要是NVARCHAR时。

e.g。这将产生错误,因为@SQL需要是NVARCHAR

声明您的变量@sql varchar to nvarchar,这样可以正常工作:

declare @sql nvarchar(max)

<强>更新

更改您的sql设置,如下所示:您需要在列名中使用[]作为[ColumName]

set @sql ='alter table #TempTable add ['+ CONVERT(varchar,@pasyear,106)+'] varchar(50)'

set @sql = 'update #TempTable set ['+CONVERT(varchar,@pasyear,106) +']='+@temp +' where years='''+CONVERT(varchar,@pasyear,106)+''