Sql server 动态地将列添加到可诱惑的?

Sql server 动态地将列添加到可诱惑的?,sql-server,Sql Server,在我的sqluery中,我尝试动态添加列,但它显示了如下错误: Msg 214,16级,状态2,程序sp_executesql,第1行 过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。 这是我的程序 declare @curntyear int declare @pasyear int declare @sql nvarchar(max) declare @temp var

在我的sqluery中,我尝试动态添加列,但它显示了如下错误: Msg 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,15级,状态1,第1行 “2009”附近的语法不正确。 Msg 102,15级,状态1,第1行 “2010”附近的语法不正确。 alter table#诱惑添加2010 varchar(50) 更新#诱惑集2010=9300,其中年份=2010

declare @sql varchar(max)
将来

在错误消息和(我的粗体)中告诉您这一点

[@statement=]语句

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


听起来像是在用VARCHAR语句调用sp_executesql,而它需要是NVARCHAR

e、 g.这将给出错误,因为@SQL需要是NVARCHAR

将变量
@sql
varchar声明为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)+''

你真的读到错误信息了吗?然后将其与@sql使用的类型进行比较?或者看看MSDN关于sp_executesql以及预期的数据类型?是的,应该是@sal nvarchar,new error=new question我的意思是我更新了我的问题并执行了查询,但它显示了error new error=new question。我们已修复了您原来的错误。不要用全新的无关问题更改或更新您的问题!是的,我换了外套,请检查一下,我们已经回答了原来的问题。你的新错误应该是一个新问题。谢谢你,gbn先生,我看到了这个问题,但我仍然没有执行代码,我得到了不同的错误。我的意思是我更新了我的问题并执行了查询,但它显示了错误。
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)+''