如何将SQL语句输出写入CSV文件?

如何将SQL语句输出写入CSV文件?,sql,sql-server-2008,ssis,Sql,Sql Server 2008,Ssis,我们有一个脚本任务,它处理平面图,将数据插入数据库,然后将任何重复项(通过存储过程)记录到一个SQL表中,然后将其传递给一个工作流任务,该任务将查找该表并将所有数据写入一个文件,然后构建该表 问题是,即使记录了0个错误,它也总是写入一个日志文件 在重复日志表中有>0条记录的情况下,是否有方法写入平面文件 您可以尝试以下操作..在执行任务之前放置一个脚本以检查文件大小,并添加一个“优先约束”…如果为TRUE,则继续。与 Dim FileInfo As System.IO.FileInfo 您可以

我们有一个脚本任务,它处理平面图,将数据插入数据库,然后将任何重复项(通过存储过程)记录到一个SQL表中,然后将其传递给一个工作流任务,该任务将查找该表并将所有数据写入一个文件,然后构建该表

问题是,即使记录了0个错误,它也总是写入一个日志文件


在重复日志表中有>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: