使用 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' 附近的语法错误”错误的主要内容,如果未能解决你的问题,请参考以下文章

测试变量向量并在表上求和,在R中创建新列

如何编写用于在表中创建新拆分分区的 plsql 代码?

为啥 AS3 在 for 循环中创建新实例?

使用正则表达式在 Pandas 数据框中创建新列 [重复]

在 django 中创建新用户不提供散列密码

如何在 python+numpy/pandas 中使用二值化在 json 文件中创建新列