【问题标题】: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 语句工作正常。我想我在变量/参数映射中犯了一个错误,但我不确定。

我的数据流如下所示:

基本上是这样的:

  1. First Execute SQL Task 创建新表

  2. 第二次执行 SQL 任务选择一个具有完整结果集的表进入对象类型变量“AllocItems”

  1. Foreach 循环容器(配置为 ADO 枚举器)将特定行从“AllocItems”映射到变量“AllocItemsSQL1”。这些字符串应该成为我正在创建的表中的字段名称

  1. 在 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吧?如果不是,请删除标签。

标签: sql sql-server ssis


【解决方案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 无法参数化。您必须使用字符串连接创建语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多