传递 SSIS parameter/variable 值的最佳方法

Best approach to pass SSIS parameter/variable value

有多种方法可以将值传递给 SSIS 包。我们可以使用变量、包参数或项目参数,我们也可以将值保存在 table 中并要求 SSIS 从 table 中选择值。现在,我的编码方式是使用项目参数并获取变量以使用它们。部署到SSIS目录时,可以根据用户要求设置ENV覆盖Param值。现在,我正在权衡 risks/ease 由用户设置 ENV 以传递参数值与设置 table 以在 SSIS 中保存值和代码以选择值。请谈谈您对这两种方法的优缺点的看法。

例如:假设我们有一个用于将数据保存到 CSV 文件的 SSIS 包。必须保存 CSV 文件的文件夹路径因服务器而异 (DEV/UA/Prod)。最好将文件夹路径值与服务器名称一起保存在 table 中,还是最好将文件夹路径值设置为 Param 并要求执行的用户在执行时在 ENV 中设置文件夹值,具体取决于在服务器上?

2022 年 3 月 23 日更新 - 基于所有有价值的输入,我决定使用参数和变量而不是使用 SQL table 来选择值.

根据我的经验,最好使用执行 SQL 任务并将结果返回给变量来为变量提供服务。它是模块化的,这意味着如果需要可以很容易地禁用某些步骤。

为了管理连接(没有完全 hard-coding 连接字符串)我建议通过参数保存 CSV 文件位置。可以通过 SQL 脚本代理在部署环境中修改参数,不需要更改源 table。如果我能避免它,我永远不会将文件位置信息放在源 table 中,因为它使 table 更少 exportable.

如官方文档所述:

Integration Services (SSIS) parameters allow you to assign values to properties within packages at the time of package execution.

在 SQL Server 2012 中引入了参数。添加此选项是为了避免使用变量和外部配置文件在程序包执行时传递参数。

如果 CSV 文件目录根据包环境而变化,这意味着参数最适合这种情况。不过,也可以使用其他选项。

参考资料

有多种方法可用,每种方法各有利弊。

无论是包级别还是项目级别,使用参数都适用于需要在执行时定期更改的任何内容。因为可以使用脚本任务更改这些,然后可以在脚本末尾启动包。这也意味着需要执行包的任何人都必须具备适当的安全级别和知识。

设置环境适用于静态内容,例如连接字符串或错误的电子邮件地址。可以设置一个主环境并让其他文件夹使用该环境,或者您需要为每个文件夹设置它。缺点是部署包的人需要知道它们是如何使用的,如果它们在目录文件夹之外,那么在 SQL 服务器代理中映射需要额外的步骤。

我的首选方法是创建一个 table 来保存信息,然后程序包连接到 table 第一步并将值加载到变量。我已经在我目前的职位上实施了这个,它已经成为所有包裹的标准。它允许默认一些内容,我们有 table 用于 DEV、QA 和 Prod,以便在迁移包时填充值。table 包含包名称、变量名称、变量值和审计列以查看何时添加或更新行。 table 是临时的,因此它会跟踪所有更改。

这些包执行一个 SP,该 SP 将行转换为 return 单行。数据透视表是动态的,因此它会根据需要向结果集中添加列。当一个值被标记为包名称的默认值时,它会出现在所有包中,但如果包名称下列出了相同的变量名称,它将显示而不是默认值。例如,在测试时,我可能想将所有错误消息发送到我的电子邮件而不是组收件箱。我将添加一条记录我的包裹名称,Email_Alert,我的电子邮件地址。这将显示为我的电子邮件地址进行测试,在进行 QA 或 Prod 时,我不会将该记录包含在其他 table 中,因此它使用默认收件箱。

利用 table 还使我能够拥有一个 SSRS 报告,该报告显示用于每个包的变量,还允许我根据需要更改值,同时保留审计日志以记录谁更改了什么值和时间。当需要更改某些内容以进行回溯或其他任何事情时,这很有用,因为我可以使更改执行包,然后再将值改回。如果部门曾经对任何事情进行过审计,我可以在几分钟而不是几天内提供完整的审计线索。还有一条已实施的规则,即不允许将任何值硬编码到变量中,它们必须位于 table 中。存储过程名称也保存在 table 中并传递给包,因此如果我们需要更新 SP,我们不需要重新部署包。

我们尝试构建所有 SSIS 包,这样我们就可以适应变化,而无需重新部署,因为这是经常出错的地方。