Sql Alter Table列语法错误

Sql Alter Table列语法错误,sql,sql-server,database,alter-table,Sql,Sql Server,Database,Alter Table,我需要创建一个具有动态列的表,因此我创建了一个游标,该游标在表的记录中循环,并将创建必要的列,但是,它给了我以下错误: “INT”附近的语法不正确 示例代码: SELECT @sql = 'ALTER TABLE #temp3 ADD ' + @nome + ' INT' EXEC (@sql); 我也试过: EXEC ('ALTER TABLE #temp3 ADD ' + @nome + ' INT') 但还是一样的错误 有什么建议吗 编辑: 价值实例​​可以接收@nome 非常糟糕

我需要创建一个具有动态列的表,因此我创建了一个游标,该游标在表的记录中循环,并将创建必要的列,但是,它给了我以下错误:

“INT”附近的语法不正确

示例代码:

SELECT @sql = 'ALTER TABLE #temp3 ADD ' + @nome + ' INT'
EXEC (@sql);
我也试过:

EXEC ('ALTER TABLE #temp3 ADD ' + @nome + ' INT')
但还是一样的错误

有什么建议吗

编辑: 价值实例​​可以接收@nome

  • 非常糟糕
  • 坏的
  • 很好

    • 您已经指出,
      @nome
      可能包含,例如,非常坏的。如果是这样,则它包含一个空格-您需要对名称进行分隔,以便SQL Server知道该空格是名称的一部分:

      SELECT @sql = 'ALTER TABLE #temp3 ADD [' + @nome + '] INT'
      EXEC (@sql);
      
      或者更恰当地说,使用


      否则,SQL Server将尝试添加一个名为
      Very
      的列,其数据类型为
      Bad
      ,之后它甚至不知道如何解释
      int

      您已经指出
      @nome
      可能包含,例如,Very Bad。如果是这样,则它包含一个空格-您需要对名称进行分隔,以便SQL Server知道该空格是名称的一部分:

      SELECT @sql = 'ALTER TABLE #temp3 ADD [' + @nome + '] INT'
      EXEC (@sql);
      
      或者更恰当地说,使用


      否则,SQL Server试图添加一个名为
      Very
      的列,其数据类型为
      Bad
      ,之后它甚至不知道如何解释
      int

      感谢@Damien鼓励我调查:

      if object_id(N'#tempg') is not null
          drop table #tempg
      
      select 1 as i into #tempg
      
      select * from #tempg
      
      alter table #tempg add j int
      
      exec sp_executesql N'alter table #tempg add k int'
      
      select * from #tempg
      
      注意

      exec 'alter table #tempg add l int'
      
      失败于

      Msg 102, Niveau 15, État 1, Ligne 1
      Syntaxe incorrecte vers 'alter table #tempg add l int'.
      
      ============================================= 版本


      感谢@Damien鼓励我调查:

      if object_id(N'#tempg') is not null
          drop table #tempg
      
      select 1 as i into #tempg
      
      select * from #tempg
      
      alter table #tempg add j int
      
      exec sp_executesql N'alter table #tempg add k int'
      
      select * from #tempg
      
      注意

      exec 'alter table #tempg add l int'
      
      失败于

      Msg 102, Niveau 15, État 1, Ligne 1
      Syntaxe incorrecte vers 'alter table #tempg add l int'.
      
      ============================================= 版本


      运行时不知道nome包含什么,这是任何人的猜测。除了/而不是
      EXEC
      ing构造的字符串,还可以尝试
      PRINT
      ing它,因此,您可以看到正在运行的内容。变量
      @nome
      中设置的值是什么?我的另一个建议是:更努力地想出一个不需要动态列的解决方案-也许这只是一个演示问题,可以在非数据库层更好地处理。不能确定引用,而是确定exec执行环境不知道临时表。@tschmit007-不正确。在
      exec
      的范围内,可以引用在外部范围中创建的临时表。也许您正在考虑表变量,而不知道
      @nome
      包含什么,这是任何人的猜测。除了/而不是
      EXEC
      ing构造的字符串,还可以尝试
      PRINT
      ing它,因此,您可以看到正在运行的内容。变量
      @nome
      中设置的值是什么?我的另一个建议是:更努力地想出一个不需要动态列的解决方案-也许这只是一个演示问题,可以在非数据库层更好地处理。不能确定引用,而是确定exec执行环境不知道临时表。@tschmit007-不正确。在
      exec
      的范围内,可以引用在外部范围中创建的临时表。可能您认为表变量只会产生错误,因为要
      exec
      一个文本字符串,您必须使用
      exec()
      ()
      将字符串括起来
      exec对象
      用于执行存储过程。如果没有括号,sql认为这是一个只会产生错误的过程,因为要执行文本字符串,必须使用
      exec()
      ()
      将字符串括起来
      exec对象
      用于执行存储过程。如果没有括号,sql认为这是一个过程问题得到了解决。但我会做一些测试。非常感谢。显然问题已经解决了。但我会做一些测试。非常感谢。