使用 foreach 循环容器在 table 中创建新列 - 无法解决 "incorrect syntax near '@P1'" 错误
Using foreach loop container to create new columns in a table- can't solve "incorrect syntax near '@P1'" error
我正在尝试使用 foreach 循环容器获取行值并将它们放入字段中。但出于某种原因,如果没有 运行 出现此错误,我将无法正常工作:
alter table /databasename/.dbo.cp_hh_foo..." failed with the following error: "Incorrect syntax near '@P1'.
问题似乎出在最后的执行 SQL 语句中。前两个 execute SQL 语句工作正常。我想我的 variable/parameter 映射有误,但我不确定。
我的数据流是这样的:
基本上是这样的:
首先执行SQL任务创建新的table
第二次执行 SQL 任务选择 table,完整结果集进入 object-type 变量 "AllocItems"
- Foreach 循环容器(配置为 ADO 枚举器)将特定行从 "AllocItems" 映射到变量 "AllocItemsSQL1"。这些字符串应该成为我正在创建的table
中的字段名称
- 在 foreach 循环容器中执行 SQL 任务会改变 table。 SQL 查询:
alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
我尝试过的事情:
- 在最终执行 sql 任务中,在参数周围添加括号:“(?)”而不是“?”
- 最后执行sql任务,将参数名改为"Param1"
- 最后执行sql任务,改变参数大小
- 秒内执行sql任务,改变"result name"
- 在最终执行 sql 任务中,将查询更改为 "declare @SQL varchar(255) set @SQL = 'alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)' exec(@SQL)"
提前感谢您的任何建议!
这个
alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
是数据定义语言 (DDL) 语句。 DDL 不能参数化。您必须使用字符串连接创建语句。
以 David 的回答为基础
创建一个新的 SSIS 变量,@[User::Sql],类型为字符串,并在表达式框中添加以下语法
"alter table MIT_Client_Profitability.dbo.cp_hh_footprint add " + @[User::AllocItemSQL1] + " varchar(255);"
这种方法的好处是您可以在执行 SQL 任务上放置一个断点,并在任务尝试执行它之前查看语句的外观。然后修改执行 SQL 任务以使用新变量并删除参数。
否则,动态 tsql 方法应该有效,只是您需要修改语法。令牌替换在字符串内不起作用。更像这样的东西应该符合我的心智模型
declare @newcolumn varchar(255) = ?;
declare @SQL varchar(255) = 'alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ' + @newcolumn + ' varchar(255)';
exec(@SQL);
我正在尝试使用 foreach 循环容器获取行值并将它们放入字段中。但出于某种原因,如果没有 运行 出现此错误,我将无法正常工作:
alter table /databasename/.dbo.cp_hh_foo..." failed with the following error: "Incorrect syntax near '@P1'.
问题似乎出在最后的执行 SQL 语句中。前两个 execute SQL 语句工作正常。我想我的 variable/parameter 映射有误,但我不确定。
我的数据流是这样的:
基本上是这样的:
首先执行SQL任务创建新的table
第二次执行 SQL 任务选择 table,完整结果集进入 object-type 变量 "AllocItems"
- Foreach 循环容器(配置为 ADO 枚举器)将特定行从 "AllocItems" 映射到变量 "AllocItemsSQL1"。这些字符串应该成为我正在创建的table 中的字段名称
- 在 foreach 循环容器中执行 SQL 任务会改变 table。 SQL 查询:
alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
我尝试过的事情:
- 在最终执行 sql 任务中,在参数周围添加括号:“(?)”而不是“?”
- 最后执行sql任务,将参数名改为"Param1"
- 最后执行sql任务,改变参数大小
- 秒内执行sql任务,改变"result name"
- 在最终执行 sql 任务中,将查询更改为 "declare @SQL varchar(255) set @SQL = 'alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)' exec(@SQL)"
提前感谢您的任何建议!
这个
alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
是数据定义语言 (DDL) 语句。 DDL 不能参数化。您必须使用字符串连接创建语句。
以 David 的回答为基础
创建一个新的 SSIS 变量,@[User::Sql],类型为字符串,并在表达式框中添加以下语法
"alter table MIT_Client_Profitability.dbo.cp_hh_footprint add " + @[User::AllocItemSQL1] + " varchar(255);"
这种方法的好处是您可以在执行 SQL 任务上放置一个断点,并在任务尝试执行它之前查看语句的外观。然后修改执行 SQL 任务以使用新变量并删除参数。
否则,动态 tsql 方法应该有效,只是您需要修改语法。令牌替换在字符串内不起作用。更像这样的东西应该符合我的心智模型
declare @newcolumn varchar(255) = ?;
declare @SQL varchar(255) = 'alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ' + @newcolumn + ' varchar(255)';
exec(@SQL);