如何将SQL语句输出写入CSV文件?
我们有一个脚本任务,它处理平面图,将数据插入数据库,然后将任何重复项(通过存储过程)记录到一个SQL表中,然后将其传递给一个工作流任务,该任务将查找该表并将所有数据写入一个文件,然后构建该表 问题是,即使记录了0个错误,它也总是写入一个日志文件如何将SQL语句输出写入CSV文件?,sql,sql-server-2008,ssis,Sql,Sql Server 2008,Ssis,我们有一个脚本任务,它处理平面图,将数据插入数据库,然后将任何重复项(通过存储过程)记录到一个SQL表中,然后将其传递给一个工作流任务,该任务将查找该表并将所有数据写入一个文件,然后构建该表 问题是,即使记录了0个错误,它也总是写入一个日志文件 在重复日志表中有>0条记录的情况下,是否有方法写入平面文件 您可以尝试以下操作..在执行任务之前放置一个脚本以检查文件大小,并添加一个“优先约束”…如果为TRUE,则继续。与 Dim FileInfo As System.IO.FileInfo 您可以
在重复日志表中有>0条记录的情况下,是否有方法写入平面文件 您可以尝试以下操作..在执行任务之前放置一个脚本以检查文件大小,并添加一个“优先约束”…如果为TRUE,则继续。与
Dim FileInfo As System.IO.FileInfo
您可以获得文件长度,如…FileInfo.length。这里有一个可能的选项,可以帮助您消除没有记录的错误文件 下面是关于如何做到这一点的逐步过程。在本例中,我使用了一个名为
Country\u State.csv
的csv文件,其中包含国家和州作为源文件
场景:
示例包将读取该文件,然后写入名为Destination.txt的文本文件。在这种情况下,将创建错误文件error.txt
,但如果没有错误,将在稍后删除。在这里,我将文件存储在路径c:\temp\
逐步流程:
在连接管理器部分,创建三个平面文件连接,即源连接、目标连接和错误连接。请参阅屏幕截图#1
Source
连接应指向csv文件路径c:\temp\Country\u State.csv
。有关此文件的内容,请参阅屏幕截图2
Destination
连接应指向名为c:\temp\Destination.txt
的文本文件李>
Error
连接应指向名为c:\temp\Error.txt
的文本文件
创建一个名为ErrorCount
的数据类型为Int32的变量
在控制流选项卡上,放置数据流任务
,然后放置文件系统任务
将数据流任务连接到文件系统任务
右键单击数据流任务和文件系统任务之间的连接器
在优先约束编辑器上,将求值操作更改为表达式,并将值粘贴到表达式文本框中
您的控制流应该如屏幕截图3所示
在“数据流”选项卡上的“数据流”任务中,拖放平面文件源,并将其配置为使用Source
连接管理器
放置平面文件目标并将其配置为使用连接管理器
将绿色输出箭头从平面文件源连接到平面文件目标
在数据流选项卡上放置一个行计数
转换,并将其配置为使用变量User:ErrorCount
将平面文件源中的红色输出箭头连接到行计数转换
放置平面文件目标并将其配置为使用连接管理器
使用Error
connection将行计数输出连接到平面文件目标李>
您的数据流任务应该如屏幕截图4所示
在“控制流”选项卡上,双击文件系统任务
在文件系统任务编辑器上,将操作设置为删除文件
,并将SourceConnection设置为错误
。请参阅屏幕截图#5
在执行包之前,文件夹路径C:\temp
的内容显示在屏幕截图#6中
数据流选项卡的执行如屏幕截图7所示
控制流执行如屏幕截图8所示
执行包后文件夹路径C:\temp
的内容显示在屏幕截图#9中
为了说明这一点,我将源
连接管理器上的第二列更改为整数(即使状态名称是字符串),以便数据流任务重定向到错误
输出
场景2数据流选项卡执行如屏幕截图#10所示
场景2控制流执行如屏幕截图#11所示。请注意,文件系统任务不会执行,因为错误文件不是空的
场景2包执行后的文件夹路径C:\temp
的内容显示在屏幕截图#12中。请注意,即使没有成功的行,文件Destination.txt仍然存在。这是因为如果错误文件为空,则示例仅删除该文件
类似的逻辑可用于删除空的目标文件
希望有帮助
屏幕截图#1:
截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
截图#7:
截图#8:
截图#9:
截图#10:
截图#11:
截图#12: