使用 foreach 循环容器在表中创建新列 - 无法解决“'@P1' 附近的语法错误”错误
Posted
技术标签:
【中文标题】使用 foreach 循环容器在表中创建新列 - 无法解决“\'@P1\' 附近的语法错误”错误【英文标题】:Using foreach loop container to create new columns in a table- can't solve "incorrect syntax near '@P1'" error使用 foreach 循环容器在表中创建新列 - 无法解决“'@P1' 附近的语法错误”错误 【发布时间】:2020-04-21 22:32:23 【问题描述】:我正在尝试使用 foreach 循环容器来获取行值并将它们放入字段中。但由于某种原因,如果不遇到此错误,我无法让它工作:
alter table /databasename/.dbo.cp_hh_foo...”失败并出现以下错误:“'@P1' 附近的语法不正确。
问题似乎出在最后的执行 SQL 语句中。前两个执行 SQL 语句工作正常。我想我在变量/参数映射中犯了一个错误,但我不确定。
我的数据流如下所示:
基本上是这样的:
First Execute SQL Task 创建新表
第二次执行 SQL 任务选择一个具有完整结果集的表进入对象类型变量“AllocItems”
-
Foreach 循环容器(配置为 ADO 枚举器)将特定行从“AllocItems”映射到变量“AllocItemsSQL1”。这些字符串应该成为我正在创建的表中的字段名称
-
在 foreach 循环容器中执行 SQL 任务会更改表。 SQL 查询:
alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
我尝试过的事情:
在最终执行 sql 任务中,在参数周围添加括号:“(?)”而不是“?” 在最终执行sql任务中,将参数名称更改为“Param1” 在最终执行 sql 任务中,更改参数大小 第二次执行sql任务,改变“结果名称” 在最终执行 sql 任务中,将查询更改为“declare @SQL varchar(255) set @SQL = 'alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ?varchar(255)' exec(@SQL)”提前感谢您的任何建议!
【问题讨论】:
你不是说mysql吧?如果不是,请删除标签。 【参考方案1】:以大卫的回答为基础
创建一个新的 SSIS 变量,@[User::Sql] 类型的 String 并在表达式框中,添加以下语法
"alter table MIT_Client_Profitability.dbo.cp_hh_footprint add " + @[User::AllocItemSQL1] + " varchar(255);"
这种方法的好处是您可以在执行 SQL 任务上放置一个断点,然后在任务尝试执行它之前查看该语句的样子。然后修改 Execute SQL Task 以使用新变量并删除参数。
否则,动态 tsql 方法应该起作用,只是您需要修改语法。令牌替换在字符串中不起作用。根据我的心智模型,更像这样的东西应该起作用
declare @newcolumn varchar(255) = ?;
declare @SQL varchar(255) = 'alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ' + @newcolumn + ' varchar(255)';
exec(@SQL);
【讨论】:
【参考方案2】:这个
alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
是一种数据定义语言 (DDL) 语句。 DDL 无法参数化。您必须使用字符串连接创建语句。
【讨论】:
以上是关于使用 foreach 循环容器在表中创建新列 - 无法解决“'@P1' 附近的语法错误”错误的主要内容,如果未能解决你的问题,请参考以下文章