在我的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
答案 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)+''