我正在通过五十个或更多Excel文件进行Excel循环。循环遍历每个Excel文件,抓取所有数据并将其输入数据库而不会出错。这是将延迟验证设置为true的典型过程,并确保Excel连接的表达式是一个名为EFile
的字符串变量,设置为空(在循环中)。
什么不起作用:尝试将Excel文件的名称输入到数据库中。
尝试了什么(编辑; SO改变了我的2比1 - 不知道为什么):
在Excel文件和数据库输入之间添加派生列,并使用EFile表达式添加列(因此在派生列中的表达式下,它将是@ [User :: EFile])。并添加空。但是,这没有任何空白(没有)。
一个建议是添加一个ANOTHER字符串变量并将其属性EvaluateAsExpression设置为True,并将Expression设置为EFile变量(@ [User :: EFile])。有趣的是,这会做同样的事情 - 在数据库中输入一个空白。
博客上有很多人声称他们可以做到这一点,但我还没有看到一个人真正解决这个问题(我有一个博客,当我得到答案时,我肯定会向人们展示如何做到这一点,因为到目前为止,这些其他人已经失败了)。如何获取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)。当我运行包时,它输入了完整的文件路径。也许,就像连接一样,它需要最初认为文件存在才能输入全部字符?
感谢所有帮助。
答案 0 :(得分: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]
答案 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