SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)

Posted

技术标签:

【中文标题】SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)【英文标题】:SSIS Execute SQL Task, Rows affected on MERGE Statement (Oracle & SQL Server) 【发布时间】:2015-02-02 16:49:17 【问题描述】:

我有一个 SSIS 包,我需要在其中执行带有执行 SQL 任务的 MERGE 语句。我需要在 Oracle DB 和 SQL Server 2012 DB 上执行此操作。我的问题是,如何将受影响的行数作为 ResultSet 保存,以便将其保存在 SSIS 包中的变量中?我不需要知道是更新还是插入,也不想在 Oracle 上创建过程,因为 MERGE 是动态的,并且通过变量中的表达式在包中计算。我只想获取受影响的行的值。

P.S.:如果我不能使用执行 SQL 任务,我可以至少使用一个脚本来运行 MERGE 吗?问题是,根据我的阅读,Oracle 上的 ExecuteNonQuery() 不会返回受 MERGE 影响的行。而且我找不到任何有关 SQL Server 的信息。有人可以帮忙吗?

提前致谢。

更新:我刚刚使用 ExecuteNonQuery() 为 SQL Server 检查了一个脚本,它确实返回了受影响的数量或行数。但是,如果我可以避免脚本并使用执行 SQL 任务会更好,但是如何将受影响的行作为 ResultSet?

【问题讨论】:

您绝对可以使用脚本任务来完成。不了解 Oracle,但考虑使用 ExecuteScalar()。 只有在返回表并检索第一列的第一行时,ExecuteScalar() 才起作用?受影响的行数不会在表中返回,是吗? 【参考方案1】:

在 SQL Server 上,您可以将 OUTPUT 子句与合并语句一起使用。这里有一些东西供你阅读。 对于 Oracle,请阅读:PLSQL: Get number of records updated vs inserted when a merge statement is used

https://www.simple-talk.com/sql/learn-sql-server/implementing-the-output-clause-in-sql-server-2008/

【讨论】:

问题是我不知道如何获取 SQL%ROWCOUNT 作为 ResultSet,因为它需要是一个表,并且 SELECT FROM DUAL 不起作用,所以我不确定我如何检索该值。 将您的合并语句放在一个存储过程中,该过程在 MERGE 之后执行行数的 SELECT。从执行 SQL 任务中调用存储过程。

以上是关于SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)的主要内容,如果未能解决你的问题,请参考以下文章

从 SSIS 调用时删除语句失败

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

SSIS 合并声明日期时间未更新

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

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

在 SSIS 执行 SQL 任务中捕获错误行