如何检索文件名并使用SSIS包将其存储在数据库中?

时间:2013-01-18 22:22:21

标签: sql-server ssis

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

什么不起作用:尝试将Excel文件的名称输入到数据库中。

尝试了什么(编辑; SO改变了我的2比1 - 不知道为什么):

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

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

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

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

    注意:我已经能够从Excel文件中导入数据了 - 这很简单(请参阅我的GitHub帐户,因为我有两个不同的项目用于导入各种txt,csv,xls ,xlsx数据)。我也试图将正在导入的文件的实际名称导入数据库。因此,如果有五十个Excel文件以及每个文件中的数据,则数据库将包含五十个文件名以及该数据(因此,如果每个文件具有1000行数据,则每1000行也将具有该文件的名称他们来自他们旁边作为一个额外的专栏)。这一点似乎引起了很多混乱,因为人们认为我在文件中导入数据时遇到问题 - NOPE,请参阅我的GitHub;再说那很容易。这是需要导入的FILENAME。

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

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

    感谢所有帮助。

4 个答案:

答案 0 :(得分:5)

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

Original

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

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

New expression

答案 1 :(得分:1)

如果您使用ForEach循环来处理文件夹中的文件,那么我已经使用SSIS Junkie博客中描述的技术将文件名转换为SSIS变量:SSIS: Enumerating files in a Foreach loop

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

答案 2 :(得分:1)

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

托尼,非常感谢这个链接。非常感谢。

此致 杰米

答案 3 :(得分:1)

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

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

希望有所帮助。

JT