文件处理后如何将文件移动到存档文件夹?
我试图将一组文件从源path存档到一个存档path,一旦我完成了一些数据stream任务项目。 Foreach循环容器的内部我有:脚本任务 – >数据stream任务 – >执行SQL任务 – >文件系统任务
我有一个用户variables设置为Foreach循环容器中集合设置下的“名称和扩展名”项。 该variables被称为“文件名”,并在脚本任务(用于从文件parsing出信息并执行执行SQL任务)以及在平面文件连接pipe理器中的数据stream任务中使用平面文件源元素。 然后parsing文件并将数据插入到数据库中。 所有的工作,因为它应该,直到我到文件系统任务(FST)。
我想要的是一旦它的插入完成后,该文件移动到一个存档文件夹。 使用几个在线链接( 这里 , 这里和这里 )我已经添加了不同的variables,要么硬编码或从其他variables派生。 在任何情况下,发生的事情是,在FST上我得到错误,如“path中的无效字符”或“未知path”。 如果我尝试按照上面链接的示例来适应我的文件系统结构,我现在在数据stream任务中的平面文件源步骤中出现错误,说明它无法find指定的文件。 这是因为它a)无法find文件的path,因为没有给出文件path,只是filname.ext b)无法parsing包含源文件的完整path的variables( @FullSourcePathFileName
,其值设置为@[User::SourcePath]
+ @[User::fileName]
)
我已经testing了其他各种修改,包括完成我发布的第一个示例中的内容(但是,实际上并没有执行任何数据stream任务,因此我只是添加了没有目标的平面文件源步骤),并收到了相同的一组错误。 我在这里感到不知所措,并希望就如何解决这个问题提供任何意见。
编辑:似乎它保持失败的FullArchivePathFileName
– 它永远不会计算expression式即使我已设置为“真”。 仍然困惑为什么它不评估它。 所以我做了与FullSourcePathFileName
相同的expression式,并validation了EvaluateAsExpression标志设置为True。 它仍然不评估这个variablesFullSourcePathFileName
variables正在被评估。
在SSIS 2005
创build的以下示例从给定文件夹中读取CSV文件,并将数据插入到SQL表中。 将数据导入SQL后,文件将使用“文件系统任务”移至“存档”文件夹。
循序渐进的过程:
-
在pathC:\ temp中创build一个名为Archive的文件夹。 创build两个名为File_1.csv和File_2.csv的CSV文件,并用数据填充它们。 将存档文件夹留空。 请参阅截图# 1 – # 4 。
-
在SSIS包上创build5个variables,如屏幕截图# 5所示。 使用值
C:\temp\
设置variablesRootFolder 。 使用值*.csv
设置variablesFilePattern 。 -
selectvariablesFilePath并按F4打开属性,将属性EvaluateAsExpression更改为
True
并使用值@[User::RootFolder] + @[User::FileName]
设置Expression属性,如截图# 6所示。 -
selectvariablesArchiveFolder ,然后按F4打开属性,将属性EvaluateAsExpression更改为
True
并使用值@[User::RootFolder] + "Archive\\"
设置Expression属性,如屏幕截图# 7所示。 -
在SSIS包的连接pipe理器上,创build一个名为CSV的新的平面文件连接。 请参阅截图# 8 。 configuration平面文件连接,如屏幕截图# 9 – # 13所示 。 另外,创build一个名为SQLServer的OLE DB连接来连接到SQL Server数据库。 连接创build后,它应该看起来像截图# 14所示。
-
右键单击平面文件连接CSV并select属性,然后使用省略号buttonconfiguration值为@ [User :: FilePath]的ConnectionStringexpression式,如屏幕截图# 15 – # 16所示 。
-
使用SQL Scripts部分下提供的脚本在SQL Server中创build一个名为
dbo.Items
的表。 CSV文件数据将被插入到此表中。 -
在“控制stream”选项卡上,放置一个
Foreach Loop container
,Data Flow Task
和File System Task
,如屏幕截图# 17所示。 -
configurationForeach循环容器,如屏幕截图# 18 – # 19所示 。
-
在数据stream任务中,放置一个平面文件源,派生列转换和一个OLE DB目标,如截屏# 20所示。
-
configuration平面文件源,如屏幕截图# 21和# 22所示 。 这将从CSV文件中读取数据。
-
configuration派生列转换,如屏幕截图# 23所示。 这用于使用相同名称的variables创buildFilePath列值。
-
如屏幕截图# 24和@ 25所示configurationOLE DB目的地。 这会将数据插入到SQL表中。
-
在控制stream选项卡上,configuration文件系统任务,如屏幕截图# 26所示。 请注意,在移动文件操作的同时,
DestinationVariable
只能被指定为一个目录,而不能被指定为完整的文件path。 如果指定了文件path,将会收到错误消息[File System Task] Error: An error occurred with the following error message: "Could not find a part of the path.".
-
屏幕截图# 28显示了在执行包之前表中没有数据。
-
屏幕截图# 29和# 30显示了“控制stream”和“数据stream”选项卡中的软件包执行情况。
-
屏幕截图# 31和# 32显示文件已被移到存档文件夹。
-
屏幕截图# 33显示了程序包执行后表中的数据。
-
在文件系统任务上,属性
OverwriteDestination
被设置为False (这是默认值)。 如果将相同名称的文件移动到“存档”文件夹,则会出现[File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. ".
如屏幕截图# 34所示。 为避免这种情况,将OverwriteDestination设置为True,或者另一个选项是重命名文件并将其复制到Archive文件夹,然后将其删除。
希望有所帮助。
SQL脚本:
CREATE TABLE [dbo].[Items]( [Id] [int] IDENTITY(1,1) NOT NULL, [ItemNumber] [varchar](30) NOT NULL, [Price] [numeric](18, 2) NOT NULL, [FilePath] [varchar](255) NOT NULL, CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] GO
屏幕截图#1:
屏幕截图#2:
屏幕截图3:
屏幕截图#4:
屏幕截图5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10:
屏幕截图#11:
屏幕截图#12:
屏幕截图#13:
屏幕截图#14:
屏幕截图#15:
屏幕截图#16:
屏幕截图#17:
屏幕截图#18:
屏幕截图#19:
屏幕截图#20:
截图#21:
屏幕截图#22:
屏幕截图#23:
屏幕截图#24:
屏幕截图#25:
屏幕截图#26:
屏幕截图#27:
屏幕截图#28:
屏幕截图#29:
屏幕截图#30:
屏幕截图#31:
屏幕截图#32:
屏幕截图#33:
屏幕截图#34: