SSIS 2008 包配置被忽略

Cad*_*oux 10 sql-server-2008 sql-server ssis

当我在命令行上指定 /ConfigFile something.dtsConfig 时,2008 年包配置与 2005 年相比发生了变化,包中定义的变量将保留其设计时值,而不是使用配置文件中的设置。

我不太确定我完全理解如何获取要使用的外部配置文件。我读过一些文章,说只有设置的设计时配置才会覆盖外部文件的负载。这是否意味着我可以将变量更改为空字符串,然后它们会被覆盖?我不能完全删除变量!整数呢?

我看过一些文章提到使用包中的包配置关闭。

我可以使用 SSIS 包编辑器或 XML 编辑器来更改包中的配置文件路径,然后它将“最后”使用该文件的设置(无论外部 /ConfigFile 选项如何),但我不想成为改变包。我想要一个带有 Test.dtsConfig 和 Production.dtsConfig 的包,并且能够在不更改包的情况下来回交换。

现在推荐的方法是什么?

Mar*_*ian 10

您必须考虑到,当通过 BIDS 运行时,包将首先从配置文件中获取变量值,并且仅当配置文件不存在时,才会抛出警告并从包中获取该值。

现在,命令行中的情况有点不同。您可能会遇到以下情况:

  1. 在没有选择任何配置文件的情况下在 cmd 行中运行包:

    dtExec /file "e:\Work\TestPackageConfiguration\TestPackageConfiguration\TestPackage.dtsx"
    
    Run Code Online (Sandbox Code Playgroud)
    • 如果原始配置文件(让我们将其命名为 Prod)在包元数据中定义的同一路径中不存在,则使用包内部的值,您只会收到配置文件丢失的警告;
    • 如果原始配置文件存在且有效,则将使用配置文件中的值(内部值将被绕过);
  2. 在没有选择任何配置文件的 cmd 行中运行包,但在调用中设置了变量:

    dtExec /file "e:\Work\TestPackageConfiguration\TestPackageConfiguration\TestPackage.dtsx" /SET \Package.Variables[checkMe];"outside the package in cmd line"
    
    Run Code Online (Sandbox Code Playgroud)
    • 如果原始配置文件不存在,则从 /SET 包调用中获取该值;
    • 如果原始配置文件确实存在,则从配置文件中获取该值,甚至忽略 /SET(仅在上述情况下使用);
  3. 使用新的配置文件在 cmd 行中运行包(假设 DEV 而不是 Prod):

    dtExec /file "e:\Work\TestPackageConfiguration\TestPackageConfiguration\TestPackage.dtsx" /configFile "c:\ETL Config\TestPackage_config_Dev.dtsConfig"
    
    Run Code Online (Sandbox Code Playgroud)
    • 如果新的配置 (Dev) 文件存在,而旧的 (Prod) 文件不存在,则使用它的值;
    • 如果 Dev 和 Prod 配置文件都存在,则仅使用来自 Prod 的值(即使在命令行调用中指定了 DEV 也会被绕过);
  4. 使用新的配置文件和调用中的 SET 语句在 cmd 行中运行包:

    dtExec /file "e:\Work\TestPackageConfiguration\TestPackageConfiguration\TestPackage.dtsx" /configFile "c:\ETL Config\TestPackage_config_Dev.dtsConfig" /SET \Package.Variables[checkMe];"outside the package in cmd line - DEV config"
    
    Run Code Online (Sandbox Code Playgroud)
    • 如果两个配置文件都存在,将使用 Prod,所有其他配置文件都被忽略,甚至 SET;
    • 如果不存在配置文件,将使用 SET 值;

因此,简而言之,如果您想使用新的配置文件,您必须重命名/移动旧的配置文件并使用 /configFile 调用该包。如果这还不够并且想要覆盖甚至新的配置文件,那么使用 /SET 变量。或者,您可以绕过任何配置文件,只在批处理调用中使用 /SET 语句。

希望这会揭示你的可能性。