如何在包执行期间保持 SSIS 变量静态

How to keep SSIS variable static during the package execution

我有一个 SSIS 包,它从 MSSQL 数据库中读取并将其保存到 xlsx 文件中。

我使用以下格式动态更改提取:[文件名 - ddmmyyyy hhmm].xlsx

问题是这样的:我的 SSIS 包创建了一个类似 [filename - 18052021 1400].xlsx

的文件

然而,例如,当它尝试通过电子邮件发送时,时间现在是 1401,它会尝试查找 [filename - 18052021 1401].xlsx 这样不存在的文件名,因此会生成错误。

有什么方法可以让变量在执行过程中保持静态?

非常感谢,

大概你的变量的值是一个表达式,而不是一个值?如果是这样,则不要对变量使用表达式,为其分配一个值,然后使用表达式任务在 SSIS 包的开头为变量分配一个新值。没有变量名,也没有你的表达式,我无法给出确切的解决方案,但表达式任务会有这样的表达式:

@[User::YourVariableName] = {Your original Expression}

您遇到的问题是,每次读取带有表达式的变量时,都会对其求值。我 about this from to 在我的回答中,因为它可能是一个难以追踪的小问题。

目前,您正在构建一个类似于

的文件名
"FileName - " + (DT_WSTR, 2) day(getdate()) ...

正如我已经暗示的以及您正在遇到的问题,每次计算该表达式时,SSIS 都会检查当前时间。如果您的包裹 运行s 超过一分钟,您将越过边界,现在有一个“新”名称需要处理。

解决它的方法是使用系统范围变量 @[System::StartTime],而不是 getdate

"FileName - " + (DT_WSTR, 2) day(@[System::StartTime])) ...

StartTime 是程序包本身启动的时间。它可以 运行 一分钟或一天,并且该值将保持不变,因为它是您所期望的 - 包开始的时间。

如果您需要可以更改但在特定范围内保持不变的内容,请将所有部分放入一个序列容器中,然后您可以使用名为的系统范围变量(大约)ContainerStartTime。容器(sequence、foreach、for)只有一个启动时间,但可以比包本身启动晚10分钟。