触发器中语句出现异常

触发器中语句出现错误
请帮助解决:触发器中
BEGIN
SET NOCOUNT ON;
    declare @sql nvarchar(1000)
    declare @db sysname
    declare @数据表名称 nvarchar(100),@项目名称 nvarchar(100),@相关字典 nvarchar(100)
if update(代码名称)
begin
  if (select len(其他代码) from inserted)=3 --修改大类代码名称
  begin
    update a set a.相关字典=i.代码名称 from 数据项目表 a,deleted d,inserted i
      where a.相关字典=d.代码名称
  end
  else  --修改子细项目的代码名称
  begin
    set @相关字典=(select 代码名称 from 其他代码表 where 其他代码=(select left(其他代码,3) from inserted))
    declare tb cursor for
      select 数据表名称,项目名称 from 数据项目表
        where 相关字典=@相关字典
    open tb
    fetch next from tb into @数据表名称,@项目名称
    while @@fetch_status=0
    begin
      set @sql='update a set a.'+@项目名称+'=i.代码名称 from '+@数据表名称+' a,deleted d,inserted i where a.'+@项目名称+'=d.代码名称'
      --update a set a.婚姻状况=i.代码名称 from 员工情况表 a,deleted d,inserted i where a.婚姻状况=d.代码名称
      exec(@sql)
      fetch next from tb into @数据表名称,@项目名称
    end
    close tb
    deallocate tb
  end
end

END
以上代码中动态语句@Sql的内容与注释的
      --update a set a.婚姻状况=i.代码名称 from 员工情况表 a,deleted d,inserted i where a.婚姻状况=d.代码名称
完全相同,但
      --update a set a.婚姻状况=i.代码名称 from 员工情况表 a,deleted d,inserted i where a.婚姻状况=d.代码名称
去掉注释标识后可以正常执行成功,但语句
      exec(@sql)
总是出现错误,请帮助解决,谢谢。

------解决方案--------------------
建议lz先尝试一下
1:  update a set a.相关字典=i.代码名称 from 数据项目表 a,deleted d,inserted i
       where a.相关字典=d.代码名称
修改为
 update a set a.相关字典=i.代码名称 from 数据项目表 a,inserted i
       where a.相关字典=i.代码名称
2:update a set a.婚姻状况=i.代码名称 from 员工情况表 a,deleted d,inserted i where a.婚姻状况=d.代码名称
修改为

update a set a.婚姻状况=i.代码名称 from 员工情况表 a,inserted i where a.婚姻状况=i.代码名称
------解决方案--------------------
创建一个临时表Test(sql nvarcahr(1000))

在游标循环内部将@sql的值插入Test表中,检查表中sql的值看看有什么异样