将 SQL 查询中的值动态存储到 SSIS 变量中

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

这是一个由两部分组成的问题。是否有最佳实践方法/解决方法可以使用表达式将查询的返回值动态设置到 SSIS 变量中?我研究并阅读了文档,似乎 SSIS 变量表达式存储表达式的值,而不是返回/运行时值。

例如,我想要将最大日期的重新调整值存储在名为 [User::MaxDate] 的变量中,而不是查询字符串。

变量:[用户::MaxDate] 表达式:(SELECT MAX(dateCol) AS dt FROM tblDate)

如果上述不可能,是否有人利用执行 SQL 任务来设置多个变量的值?这里的想法是避免对每个动态变量初始化使用执行 SQL 任务。

我的要求是为主控制流程上的10个变量设置初始值。我试图避免使用 10 个执行 SQL 任务来完成此任务。

在 SSIS(2019 版)中不使用脚本任务或第 3 方插件是否可以实现上述操作?

谢谢你

例如,我想要将最大日期的重新调整值存储在名为 [User::MaxDate] 的变量中,而不是查询字符串。

变量:[用户::MaxDate] 表达式:(SELECT MAX(dateCol) AS dt FROM tblDate)

ssis ssis-2019
2个回答
1
投票

你是对的,你正在寻找将值存储在 SSIS 变量中。 EvaluateAsExpression 属性设置为 true 的变量意味着它将是动态的,但动态范围是 SSIS 包本身。

在您的情况下,您需要向外部提供商询问信息,因此您无法构建 SSIS 表达式来满足这一要求。

如果您可以在单个查询中获取要存储在 SSIS 变量中的 10 个值,那么是的,您可以通过单个执行 SQL 任务来完成。

如果 10 列都在一个表中,例如控制表,那么您可以进行如下查询

SELECT
    MAX(C.SalesFactDate) AS MaxSalesDate
,   MAX(C.EmployeeDimDate) AS MaxEmployeeDate
-- etc
FROM
    dbo.Control AS C;

如果您需要从实际表中获取日期,那也可以是“单个”查询

SELECT
    (SELECT MAX(C.SalesFactDate) FROM dbo.FactSales AS C) AS MaxSalesDate 
,   (SELECT MAX(C.EmployeeDimDate) FROM dbo.DimEmployees AS C) AS MaxEmployeeDate
-- etc

无论哪种方式,您都将拥有一行数据,其中包含要与 SSIS 变量关联的 1 到 N 列数据。

在主任务执行 SQL 任务屏幕上,将结果集类型从无更改为单行。

在“结果”选项卡上,您将为每列关联一个 SSIS 变量。如果您使用 OLE DB 提供程序,则列名称是从零开始的序数。 ODBC 是基于 1 的序数,ADO.NET 使用命名实体。

假设我创建了各种 Date/db_date/etc 类型的 SSIS 变量,并且使用了 OLE DB 连接管理器,屏幕将如下所示

0|@[User::SalesDate]
1|@[User::EmployeeDate]

等等


0
投票

这个功能真的有用吗? 我设置了一个 SSIS 包来从查询中获取单个值,并将变量设置为 EvaluateAsAnExpression。 我将执行 SQL 任务设置为使用单行结果集。 我将变量设置为从行集填充,并使用 0 作为“结果名称”,因为我有一个到数据库的 OLE DB 连接以进行查询。 执行 SQL 后变量中的值是 SSIS 变量的默认值(INT32):0。从查询本身来看,该值永远不可能为零(物理上不可能)。 我可能做错了什么? 我可以有变量值的表达式吗? 或者我只需要以这种方式设置属性而不实际使用表达式?

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