Sql 使用foreach循环容器在表中创建新列-can';t解决“问题”;靠近'的语法不正确@P1和x27&引用;错误

Sql 使用foreach循环容器在表中创建新列-can';t解决“问题”;靠近'的语法不正确@P1和x27&引用;错误,sql,sql-server,ssis,Sql,Sql Server,Ssis,我正在尝试使用foreach循环容器获取行值并将它们放入字段中。但出于某种原因,我无法让它正常工作,而不会遇到以下错误: alter table/databasename/.dbo.cp_hh_foo…”失败,出现以下错误:““@P1”附近的语法不正确 问题似乎出现在最后的execute SQL语句中。前两个executesql语句工作正常。我想我在变量/参数映射中犯了一个错误,但我不确定 我的数据流如下所示: 基本上是这样的: 第一个执行SQL任务创建新表 第二个执行SQL任务选择一个表,该表

我正在尝试使用foreach循环容器获取行值并将它们放入字段中。但出于某种原因,我无法让它正常工作,而不会遇到以下错误:

alter table/databasename/.dbo.cp_hh_foo…”失败,出现以下错误:““@P1”附近的语法不正确

问题似乎出现在最后的execute SQL语句中。前两个executesql语句工作正常。我想我在变量/参数映射中犯了一个错误,但我不确定

我的数据流如下所示:

基本上是这样的:

  • 第一个执行SQL任务创建新表

  • 第二个执行SQL任务选择一个表,该表的完整结果集将放入对象类型变量“AllocItems”中

  • Foreach循环容器(配置为ADO枚举器)将特定行从“AllocItems”映射到变量“AllocItemsSQL1”。这些字符串应该成为我正在创建的表中的字段名
  • 在foreach循环容器中执行SQL任务更改表。SQL查询:
    alter表MIT\u Client\u proficility.dbo.cp\u hh\u footprint add?varchar(255)
  • 我尝试过的事情:

    • 在最终的执行sql任务中,在参数“(?)”而不是“?”周围添加括号
    • 在最终执行sql任务中,将参数名称更改为“Param1”
    • 在最终执行sql任务中,更改参数大小
    • 在第二秒内执行sql任务,更改“结果名称”
    • 在最终的执行sql任务中,将查询更改为“declare@sql varchar(255)set@sql=”alter table MIT_Client_proficility.dbo.cp_hh_footprint add?varchar(255)”exec(@sql)
    提前感谢您的建议

    这个

    alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
    
    是数据定义语言(DDL)语句。无法参数化DDL。您必须使用字符串连接来创建语句。

    alter table MIT_Client_Profitability.dbo.cp_hh_footprint add ? varchar(255)
    

    是数据定义语言(DDL)语句。无法参数化DDL。您必须使用字符串连接创建语句。

    以David的答案为基础

    创建一个新的SSIS变量@[User::Sql],类型为String,并在表达式框中添加以下语法

    "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);
    

    以大卫的答案为基础

    创建一个新的SSIS变量@[User::Sql],类型为String,并在表达式框中添加以下语法

    "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);
    

    你不是说MySQL吧?如果没有,请删除标签。你不是说MySQL,是吗?如果没有,请移除标签。