在我的SSIS包中,我有一个类似于此的数据流。
我的要求是在SQL服务器表中记录每个flatfile目标的结束时间(或者每个平面文件的创建时间)。更清楚的是,日志表中每个flatfile将有一行。有没有简单的方法(最好)来实现这个目标?提前谢谢。
更新:我最终在数据流之后使用脚本任务,并读取数据流中创建的每个文件的创建时间。我还使用相同的脚本任务将日志插入表中,只是为了将事物保存在一个地方。有关详细信息,请将帖子掩盖为答案。
答案 0 :(得分:1)
在仔细查看工具箱后,我认为最好的方法是将每个源/目标配对移动到自己的数据流中,并使用每个数据流的OnPostExecute事件写入SQL表。
答案 1 :(得分:1)
为了获得作为目标创建的每个平面文件的准确日期和时间戳,您需要创建三个新的全局变量,并在当前数据之后的控制流中设置for-each循环容器流程任务,然后向for-each循环容器添加一个脚本任务,该任务将从一个平面文件一次读取日期/时间信息。然后,该信息将保存到一个新的全局变量中,然后可以在第二个SQL任务(也在for-each循环中)中应用,以将信息写入数据库表。
以下链接提供了您需要应用的步骤的一个很好的示例。您可以轻松排除一些不适用的额外步骤。
http://microsoft-ssis.blogspot.com/2011/01/use-filedates-in-ssis.html
希望这会有所帮助。
答案 2 :(得分:1)
希望为@ TabAlleman的方法提供更多细节。
对于名称为Bene_hic
的每个控制流任务,您将拥有源文件和目标文件。
在该可执行文件的'Event Handlers'
标签上(使用下拉列表),您可以创建OnPostExecute
事件。
在那种情况下,我有两个SQL任务。一个生成要为此控制流任务执行的SQL,第二个执行SQL。
这些SQL任务依赖于OnPostExecute
事件中作用域的两个用户变量。两者的EvaluateAsExpression
属性都设置为True
。第一个Variable1
用作SQL执行的模板,其值如下:
"SELECT execSQL FROM db.Ssis_onPostExecute
where stgTable = '" + @[System::SourceName] + "'"
@[System::SourceName]
是一个SSIS系统变量,包含控制流任务的名称。
我的数据库中有一个名为Ssis_onPostExecute
的表,其中包含两个字段,execSQL
字段,其值为:
DELETE FROM db.TableStats WHERE TABLENAME = 'Bene_hic';
INSERT INTO db.TableStats
SELECT CreatorName ,t.tname, CURRENT_TIMESTAMP ,rcnt FROM
(SELECT databasename, TABLENAME AS tname, CreatorName FROM dbc.TablesV) t
INNER JOIN
(SELECT 'Bene_hic' AS tname,
COUNT(*) AS rcnt FROM db.Bene_hic) u ON
t.tname = u.tname
WHERE t.databasename = 'db' AND t.tname = 'Bene_hic';
和stgTable
字段,其中包含相应控件流任务的名称(区分大小写!),如Bene_hic
在第一个SQL任务(名为SQL
)中,我将SourceVariable
设置为用户变量(User::Variable1
),并将ResultSet
属性设置为{{1结果集详细信息包含'single row.'
= Result Name
和0
作为第二个用户变量(Variable name
。)
在第二个SQL任务(User::Variable2
)中,我将exec
属性设置为SQLSourceType
,将Variable
属性设置为SourceVariable
。
然后包可以将源对象中的数据复制到目标,无论它是否失败,在表中输入一行,其中包含时间戳和复制的行数,以及表名和其他任何内容你想跟踪。
此外,在调试时,您必须运行整个程序包,而不仅仅是事件中的一个任务。否则,变量将无法正确设置。
HTH,通过几个网站上的示例,我花了很长时间才把所有这些东西都弄清楚了。我使用代码在User::Variable2
字段中为42个控制流任务中的每一个生成SQL,这意味着我创建了84个用户变量。
-Beth
答案 3 :(得分:1)
简单的解决方案是:
1)在Fatfile目标之后拖动工具箱中的OLE DB Command
。
2)Update Script
在current date
目的地成功时用Flat file
更新表格。
3)您可以使用值variable
创建systemdatetime
(范围是项目)。
4)如果成功或失败,您可能必须创建另一个variable
,具体取决于您的包构造