SSIS 错误:[执行 SQL 任务] 错误:执行查询

Posted

技术标签:

【中文标题】SSIS 错误:[执行 SQL 任务] 错误:执行查询【英文标题】:SSIS error : [Execute SQL Task] Error: Executing the query 【发布时间】:2017-12-17 12:50:07 【问题描述】:

我正在创建一个 SSIS 包并尝试通过从一个数据库调用存储过程并将结果集值插入到不同数据库的另一个表中来提取数据。我创建了一个执行 SQL 任务来提取数据,一个 for each loop 容器循环遍历结果集,并在 for 循环容器中创建了一个 Execute SQL 任务,将结果集数据插入另一个数据库表。插入记录时出现以下错误。我猜是映射的问题。

[Execute SQL Task] 错误:执行查询“insert into EmployeeCount (companyId...”失败,错误如下:“Parameter name is unrecognized.”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确、参数设置不正确或连接不正确。

按照模板设计截图

下面是foreach容器内执行sql任务的编辑窗口

插入语句

insert into EmployeeCount (companyId,dataItemName,dataItemvalue,fiscalYear,fiscalQuarter,PeriodTypeId) values(companyId,dataItemName,dataItemvalue,fiscalYear,fiscalQuarter,PeriodTypeId)

【问题讨论】:

【参考方案1】:

在参数名称的“参数映射”中,而不是“?”给出基于 0 的索引中的值,即 0,1,2,... 直到结束。

【讨论】:

按照 0,1,2 等的顺序,没有用,因此我把它放在了 ? . 正如@SanjayJ 上面指定的,从“映射窗口”中删除所有参数,并按照您分配它们的顺序放置。应该是0,1,2系列..【参考方案2】:

您必须按时间顺序设置“参数名称”。

 i.e companyID parameter must be 0, dataItemvalue to 1 ....PeriodTypeId to 5 

示例:

【讨论】:

我认为“查询”顺序而不是时间顺序?按时间顺序排列意味着有一个时间成分,而实际上没有。正确的顺序是在查询中使用值的顺序中的数字。【参考方案3】:

简单的解决方法

不用参数也可以实现,可以用表达式:

    双击Execute SQL Task,转到表达式。

    将以下表达式添加到SqlStatementSource

    "insert into EmployeeCount (companyId,dataItemName,dataItemvalue,fiscalYear,fiscalQuarter,PeriodTypeId) 
    values(" + (DT_WSTR,50)@[User::companyId] + ",'" + @[User::dataItemName] + "'," + (DT_WSTR,50)@[User::dataItemvalue] + "," + (DT_WSTR,50)@[User::fiscalYear] + "," + (DT_WSTR,50)@[User::fiscalQuarter] + "," + (DT_WSTR,50)@[User::PeriodTypeId] + ")"
    

【讨论】:

【参考方案4】:

作为一个选项:

您可能试图在较短的列中插入太长的值

例如,如果您创建 Source DB,则需要确保每列都有足够的最大长度,并且不要将最大值(太长的值)放入此列。

所以很遗憾SSIS没有指定有问题的列,需要你自己去查找或者放大每一列的最大长度。

【讨论】:

以上是关于SSIS 错误:[执行 SQL 任务] 错误:执行查询的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 执行 SQL 查询任务找不到存储过程

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误

SSIS OlEDB 连接管理器错误

如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中

SSIS 包中的 C# 脚本在 SQL Server 表的数据执行过程中挂起,没有明确的错误消息

SSIS 执行 Analysis Services 任务错误:指定的登录会话不存在。它可能已经被终止