我有一个 SSIS 包,它运行执行 SQL 任务来获取行计数,将其存储在变量中,然后使用脚本任务读取该变量并检查它是否大于 0。
我遇到的问题是,当我调试包时,它将变量读取为 -1(我认为这只是 SQL 表示查询执行成功),而不是数据库中的 38,000 行。 据我所知,一切都设置正确并以正确的方式编码,所以我不确定是什么导致了这种情况。
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;
}
}
编辑:
以下是这些变量和变量的流程:
我不会为此使用脚本任务,而是在控制流上放置一个表达式。
@Smart_rowcount > 0 在主路径上。 和 @Smart_rount<1 on the log path.
所以我的一切设置都正确,并且我的流程没有任何问题。为了解决此错误,我删除了执行 SQL 任务,使用所有完全相同的设置和所有内容重新制作了它,现在它返回了正确的结果。
“您是否尝试过将其关闭并重新打开?”
在执行 SQL 任务的
ResultSet
选项卡中,不要将列名称放入“结果名称”列中。 您放置该列的从零开始的索引。
因此,您应该在
Result Name
下设置“0”,而不是“Smart_Count”。
您的设置是正确的,“结果名称”的填写方式也是正确的。这里的另一个答案说你需要写 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作为 结果集名称。