将查询结果传递给SSIS中的变量

问题描述 投票:0回答:4

我有一个 SSIS 包,它运行执行 SQL 任务来获取行计数,将其存储在变量中,然后使用脚本任务读取该变量并检查它是否大于 0。

我遇到的问题是,当我调试包时,它将变量读取为 -1(我认为这只是 SQL 表示查询执行成功),而不是数据库中的 38,000 行。 据我所知,一切都设置正确并以正确的方式编码,所以我不确定是什么导致了这种情况。

执行SQL任务设置: enter image description here enter image description here

脚本任务中的代码: enter image description here

private byte[] emptyBytes = new byte[0];

    public void Main()
    {
        int rowCount = Convert.ToInt32(Dts.Variables["User::SMART_rowcount"].Value.ToString());

        if (rowCount > 0)
        {
            Dts.TaskResult = (int)ScriptResults.Success;
        }
        else
        {
            Dts.Log("The SMART Row Count Check has failed due to result set having no rows. Check table SMART.[SMART_SEC_MGMT_QUOTE_DATA].", (int)Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure, emptyBytes);
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    }

编辑:

以下是这些变量和变量的流程:

enter image description here enter image description here

c# sql ssis
4个回答
2
投票

我不会为此使用脚本任务,而是在控制流上放置一个表达式。

@Smart_rowcount > 0 在主路径上。 和 @Smart_rount<1 on the log path.


2
投票

所以我的一切设置都正确,并且我的流程没有任何问题。为了解决此错误,我删除了执行 SQL 任务,使用所有完全相同的设置和所有内容重新制作了它,现在它返回了正确的结果。

“您是否尝试过将其关闭并重新打开?”


0
投票

在执行 SQL 任务的

ResultSet
选项卡中,不要将列名称放入“结果名称”列中。 您放置该列的从零开始的索引。

因此,您应该在

Result Name
下设置“0”,而不是“Smart_Count”。


0
投票

您的设置是正确的,“结果名称”的填写方式也是正确的。这里的另一个答案说你需要写 0。但是只有对于具有多个值的“完整结果集”或者根本没有列名时,0 或任何其他序数位置才是必须的。

来自 SSIS - 如何通过 sql 设置 SSIS 变量 - SQLShack:

在“结果集”选项卡中,您必须指定结果名称和结果集 您想要映射到的变量。如果结果集类型为 Single row,结果名称必须是列名称或列位置 列列表。如果结果集类型是完整结果集或 XML,您 必须使用 0 作为结果集名称。

它进一步链接到 使用结果集填充变量 - Microsoft Learn:

某些返回单个值的查询可能不包含列名。 例如,语句 SELECT COUNT () FROM Production.Product 不返回列名。您可以使用以下命令访问返回结果 序数位置 0 作为结果名称。访问返回结果 根据列名,查询必须包含 AS 子句 提供列名称。语句 SELECT COUNT ()AS CountOfProduct FROM Production.Product,提供 CountOfProduct 列。你可以 然后使用 CountOfProduct 列访问返回结果列 名称或序数位置,0.

如果结果集类型是完整结果集或XML,则必须使用0作为 结果集名称。

© www.soinside.com 2019 - 2024. All rights reserved.