Sql Alter Table列语法错误
我需要创建一个具有动态列的表,因此我创建了一个游标,该游标在表的记录中循环,并将创建必要的列,但是,它给了我以下错误: “INT”附近的语法不正确 示例代码: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 非常糟糕
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认为这是一个过程问题得到了解决。但我会做一些测试。非常感谢。显然问题已经解决了。但我会做一些测试。非常感谢。