ssis foreach遍历文件夹大容量插入任务出错!

thunderbird521 2008-12-26 09:35:11
我在foreach里输出变量@filename,然后在文件链接器aa的属性表达式Expression里加入 ConnectionString = @filename
执行任务时提示:
[大容量插入任务] 错误: 指定的连接“aa”无效,或者所指的对象无效。若要继续,请指定一个有效的连接。
请大侠指点,谢谢:)
...全文
411 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
thunderbird521 2008-12-30
  • 打赏
  • 举报
回复
前两天有事,忘了结贴了
强烈感谢jinjazz 和 fcuandy ,祝二位新年好运,泡妞多多!!!
结贴发分!
jinjazz 2008-12-26
  • 打赏
  • 举报
回复
把文件中的NULL替换为你的列分隔符就可以了。
fcuandy 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 thunderbird521 的回复:]
另外有个小问题,文本文件里有个字段好多值是NULL,现在要插入SQLServer数据字段里,总提示错误
有没有办法把NULL转化成0后再插入?!
[/Quote]

测试:
将 某几个文件中的第二列 值改为 NULL, 形如:

x_03.txt

a2|123|bb1
a1|NULL|bb2
a2|NULL|bb3
a1|1333|bb4
a1|1221|bb4

执行原来的包后,出现错误,查看导入数据,某些数据未被导入,错误数超过了允许的最大错误数包执行中止。


修改包:

1,删除 数据流 中的 oledb 目标

2,切换到数据流视图, 从工具箱>数据流转换中拖动"派生列" 到数据流视图,并将 平面文件源(由上面的txt文件为例,则为三个列,输出列列名我分别命名为f0,f1,f2)指向它。

3,双击 派生列 进入编辑, 在下方派生列 列表中 新建一派生列,列名为 fx_1, 派生列一栏中 选择 "替换f1". 表达式中输REPLACE(f1,"NULL","0")。 确定

4,增加oledb目标,然后进行相应的设置(步骤如前)

然后执行包,成功, 查看表中数据,null值被换为0
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
非常感谢jinjazz ,我只能用一句话来表达我衷心的谢意:你真tmd牛逼啊!!!很强很强大!!!
虽然我仍然没有搞明白那个文件路径的问题,但是毕竟it works,You are PowerFul

另外有个小问题,文本文件里有个字段好多值是NULL,现在要插入SQLServer数据字段里,总提示错误
有没有办法把NULL转化成0后再插入?!
fcuandy 2008-12-26
  • 打赏
  • 举报
回复
我也执行了一次,很成功
jinjazz 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 thunderbird521 的回复:]
是同台机器
并且那个脚本也可以打印了,刚才不可以,是我没有设置ReadOnlyVariable
但是仍然出现错误
[大容量插入任务] 错误: 指定的连接“aa”无效,或者所指的对象无效。若要继续,请指定一个有效的连接

我现在怀疑是 <大容量插入任务>不支持ForEach,准备更换成数据流中的源数据源和目的数据源
[/Quote]

支持的,我已经测试过了,就是你的文件路径的问题。
jinjazz 2008-12-26
  • 打赏
  • 举报
回复
我试了下,如果是文件路径问题,你可以看看把文件路径写死,然后把文件名提取出来。当然最好是保证ssis包的目录结构和db的目录结构一样。

文件管理器的Expressions里面的ConnectionString属性表达式改为
"E:\\txt\\"+RIGHT( @[用户::fileName],   FINDSTRING(  REVERSE(@[用户::fileName] ) , "\\",1) )


其中E:\txt\是你在服务器上的文件路径
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
是同台机器
并且那个脚本也可以打印了,刚才不可以,是我没有设置ReadOnlyVariable
但是仍然出现错误
[大容量插入任务] 错误: 指定的连接“aa”无效,或者所指的对象无效。若要继续,请指定一个有效的连接

我现在怀疑是<大容量插入任务>不支持ForEach,准备更换成数据流中的源数据源和目的数据源
hery2002 2008-12-26
  • 打赏
  • 举报
回复
PS:你Script task上要设置ReadOnlyVariable为FileName.
然后你的脚本里面才可以读取FileName的值.
hery2002 2008-12-26
  • 打赏
  • 举报
回复
那就是你枚举的时候出现问题了.
在检查一下你的设置,还有你用户权限是否可以访问该路径的文件.
接下来就是JJ提到的那几点注意事项了.
jinjazz 2008-12-26
  • 打赏
  • 举报
回复
因为枚举必须是执行包所在机器的目录,而bulkinsert文件必须在数据库服务器。
jinjazz 2008-12-26
  • 打赏
  • 举报
回复
西安明确一个问题,你的ssis运行机器和数据库服务器是一台机器码
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hery2002 的回复:]
你用Script Task调试一下你的@FileName是什么值先~

VB.NET codePublic Sub Main()
'
Dim sFileName As String = Dts.Variables("FileName").Value.ToString
Dim sMsg As String
sMsg = "FileName is :" & sFileName

MsgBox(sMsg)
'
Dts.TaskResult = Dts.Results.Success
End Sub
[/Quote]

感谢hery2002,这段代码很有用!
确实是ForEach取filename时就有问题

错误提示:
在集合中找不到元素。如果在包的执行期间试图从容器的集合检索某个元素,但该元素不在此处,将发生此错误

为什么会有这种错误呢?我设置的没问题啊
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hery2002 的回复:]
Enumerator: Foreach File Enumerator
Folder: 你对应的Folder
Files: *.txt
Retrieve File Name: Fully Qulified
Variable Mapping: @filename index(0).
[/Quote]

just as you, the same
hery2002 2008-12-26
  • 打赏
  • 举报
回复
你用Script Task调试一下你的@FileName是什么值先~
Public Sub Main()
'
Dim sFileName As String = Dts.Variables("FileName").Value.ToString
Dim sMsg As String
sMsg = "FileName is :" & sFileName

MsgBox(sMsg)
'
Dts.TaskResult = Dts.Results.Success
End Sub
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jinjazz 的回复:]
那应该是你的Expression有问题了,你单个文件不设变量可以成功吗
[/Quote]
ConnectionString : @[用户::filename]
hery2002 2008-12-26
  • 打赏
  • 举报
回复
Enumerator: Foreach File Enumerator
Folder: 你对应的Folder
Files: *.txt
Retrieve File Name: Fully Qulified
Variable Mapping: @filename index(0).
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hery2002 的回复:]
@filename 的值是什么,
指定性错误,要选择正确的值.
你foreach的输入是什么,System.objects?
[/Quote]
不明白您的意思,foreach里只是配置了一个目录,不需要输入什么吧
输出了一个参数变量@filename
然后新建了文件连接器,指定
ConnectionString : @[用户::filename]
thunderbird521 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jinjazz 的回复:]
那应该是你的Expression有问题了,你单个文件不设变量可以成功吗
[/Quote]
单个没有问题,非常顺利!
hery2002 2008-12-26
  • 打赏
  • 举报
回复
@filename 的值是什么,
指定性错误,要选择正确的值.
你foreach的输入是什么,System.objects?
加载更多回复(5)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧