1

我正在对五十个或更多 Excel 文件进行 Excel 循环。循环遍历每个 Excel 文件,获取所有数据并将其输入数据库而不会出错。这是将延迟验证设置为 true 的典型过程,并确保 Excel 连接的表达式是一个名为的字符串变量,该变量EFile设置为空(在循环中)。

什么不工作:试图将 Excel 文件的名称输入数据库。

什么已经尝试过(编辑;所以将我的 2 更改为 1 - 不知道为什么):

  1. 在 Excel 文件和数据库输入之间添加一个派生列,并使用 EFile 表达式添加一个列(因此在派生列中的表达式下,它将是 @[User::EFile])。并添加空的。但是,这没有输入任何空白(什么都没有)。

  2. 一个建议是添加另一个字符串变量并将其属性 EvaluateAsExpression 设置为 True 并将表达式设置为 EFile 变量 (@[User::EFile])。有趣的是,它做了同样的事情——在数据库中输入一个空白。

博客上的许多人声称他们可以做到这一点,但我还没有看到有人真正解决这个问题(我有一个博客,当我得到答案时,我肯定会向人们展示如何做到这一点,因为到目前为止,其他人已经倒下短的)。如何在循环期间获取 Excel 文件的名称并将其输入数据库?

已添加:忘记添加,没有脚本;声称它可以在没有它们的情况下完成,所以我想看到没有它们的解决方案。

注意:我已经能够从 Excel 文件中导入数据——这很容易(请参阅我的 GitHub 帐户,因为我有两个不同的项目用于导入各种 txt、csv、xls、xlsx 数据)。我也在尝试将要导入的文件的实际名称也导入数据库。因此,如果有 50 个 Excel 文件,以及每个文件中的数据,则数据库将在该数据旁边有 50 个文件名(因此,如果每个文件有 1000 行数据,则每 1000 行也会有文件名它们来自旁边作为附加列)。这一点似乎引起了很多混乱,因为人们认为我在文件中导入数据时遇到了问题——不,请参阅我的 GitHub;这很容易。文件名也需要导入。

测试包:https ://github.com/tmmtsmith/SSISLoopWithFileName

解决方案:@jaimet 指出派生列需要是 @[User::CurrentFile] (请参阅测试包)。当我第一次运行包时,我的数据库中仍然有一个空白值。但是当我们最初建立连接时,我们确实将它指向一个实际的文件(我称之为“欺骗包”),然后将连接上的表达式更改为 @[User::CurrentFile],它是空白的。使用变量 @[User::CurrentFile] 的派生列显示字符串 0。因此,我删除了派生列,将完整的文件路径和名称放入变量中,然后将变量添加到派生列(其中让它认为字符串有 91 个字符长),然后返回并将变量设置为空(英语老师现在会讨厌 THEN)。当我运行包时,它输入了完整的文件路径。也许,

感谢所有的帮助。

4

4 回答 4

5

问题是由于变量中的空白值,@[User::FileNameInput]这导致 SSIS 包假定此变量的值在派生列转换中的长度始终为零。

原来的

将派生列转换上的表达式从 更改@[User::FileNameInput](DT_STR, 2000, 1252)@[User::FileNameInput]

类型转换派生列以2000将列长度设置为该最大值。该值1252表示代码页。我假设您使用的是 ANSI 代码页。我2000从您的表定义中获取了值,因为 FilePath 列有变量VARCHAR(2000)。如果列数据类型为NVARCHAR(2000),则表达式为(DT_WSTR, 2000)@[User::FileNameInput]

新表达

于 2013-01-28T17:56:07.280 回答
1

对于所有意图和目的,您的方法 #1 应该有效。这正是我将尝试做到的方式。我很困惑为什么它不起作用。你能分享你的包裹吗?

托尼,非常感谢您的链接。非常感激。

问候杰米

于 2013-01-26T20:37:52.520 回答
1

蒂姆,

您在派生列组件中使用了错误的变量。您将文件名存储在 @[User::CurrentFile] 但您在派生列组件中使用的变量是 @[User::FileNameInput]

更改您的派生列组件以使用 @[User::CurrentFile] ,您会很好。

希望有帮助。

捷通

于 2013-01-28T17:19:15.857 回答
1

如果您使用ForEach循环来处理文件夹中的文件,那么我已经使用 SSIS Junkie 的博客中描述的技术将文件名放入 SSIS 变量中:SSIS:在 Foreach 循环中枚举文件

您可以稍后在流程中使用该变量将其写入数据库。

于 2013-01-18T22:38:37.333 回答