【问题标题】:How to validate a CSV file before importing into the database using SSIS?如何在使用 SSIS 导入数据库之前验证 CSV 文件?
【发布时间】:2011-06-24 07:14:53
【问题描述】:

我有一个包含三列的 CSV 文件。

sno  sname  quantity
---  -----  --------
 1   aaa    23
 2   bbb    null
 3   ccc    34
 4   ddd    ddd
 5   eee    xxx
 6   fff    87

SQL Server 数据库中的表如下/

CREATE TABLE csvtable
(       sno         int
    ,   sname       varchar(100)
    ,   quantity    numeric(5,2)
)

我创建了一个 SSIS 包来将 csv 文件数据导入到数据库表中。因为数量是一个字符串,所以我在包执行过程中遇到错误。我创建了另一个表来存储无效数据。

CREATE TABLE wrongcsvtable
(       sno         nvarchar(10)
    ,   sname       nvarchar(100)
    ,   quantity    nvarchar(100)
)

csvtable中,我想存储以下数据。

sno  sanme   quantity
---  ------  --------
 1   aaa     23
 3   ccc     34
 6   fff     87

wrongcsvtable中,我想存储以下数据。

sno  sanme   quantity
---  ------  --------
 2   bbb     null
 4   ddd     ddd
 5   eee     xxx

有人能指出我实现上述输出的正确方向吗?

【问题讨论】:

    标签: ssis


    【解决方案1】:

    这是一种可能的选择。您可以使用Data Flow Task 中的Data Conversion 转换来实现此目的。以下示例显示了如何实现这一点。该示例使用 SSIS 2005 和 SQL Server 2008 数据库。

    分步过程:

    1. 创建一个名为 FlatFile.CSV 的文件并使用屏幕截图 #1 中所示的数据填充它。

    2. 在 SQL 数据库中,使用 SQL 脚本 部分下提供的脚本创建两个名为 dbo.CSVCorrectdbo.CSVWrong 的表。表 dbo.CSVWrong 中的字段应具有数据类型 VARCHARNVARCHARCHAR 以便它可以接受无效记录。

    3. 在 SSIS 包上,创建一个名为 SQLServer 的 OLE DB 连接以连接到 SQL Server 数据库并创建一个名为 CSV 的平面文件连接。请参阅屏幕截图 #2。如屏幕截图 #3 - #7 所示配置平面文件连接 CSV。平面文件连接中的所有列都应该配置为string数据类型,这样在读取文件的时候打包不会失败。

    4. 在包的“控制流”选项卡上,放置Data Flow Task,如屏幕截图#8所示。

    5. 在包的“数据流”选项卡上,放置Flat File Source 并按照屏幕截图#9 和#10 所示进行配置。

    6. 在包的“数据流”选项卡上,放置一个Data Conversion 转换并按照屏幕截图#11 所示进行配置。单击Configure Error Output 并将ErrorTruncation 列值从Fail 组件 更改为Redirect row。请参阅屏幕截图 #12

    7. 在包的数据流选项卡上,放置一个OLE DB Destination 并将数据转换 中的绿色 箭头连接到此 OLE DB 目标。如屏幕截图 #13 和 #14 所示配置 OLE DB 目标。

    8. 在包的“数据流”选项卡上,放置另一个OLE DB Destination,并将数据转换中的红色箭头连接到此OLE DB目标。如屏幕截图 #15 和 #16 所示配置 OLE DB 目标。

    9. 屏幕截图 #17 显示完全配置后的数据流任务。

    10. 屏幕截图#18显示了执行包之前表中的数据。

    11. 屏幕截图 #19 显示了数据流任务中的包执行情况。

    12. 屏幕截图 #20 显示包执行后表中的数据。

    希望对您有所帮助。

    SQL 脚本:

    CREATE TABLE [dbo].[CSVCorrect](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [SNo] [int] NULL,
        [SName] [varchar](50) NULL,
        [QuantityNumeric] [numeric](18, 0) NULL,
    CONSTRAINT [PK_CSVCorrect] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[CSVWrong](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [SNo] [varchar](50) NULL,
        [Quantity] [varchar](50) NULL,
        [SName] [varchar](50) NULL,
        [ErrorCode] [int] NULL,
        [ErrorColumn] [int] NULL,
    CONSTRAINT [PK_CSVWrong] 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:

    【讨论】:

      【解决方案2】:

      在您的数据流中进行条件拆分。检查数量是否为非整数。您创建的分支将转到 wrongcsvtable,默认分支将转到 csvtable

      EDIT 忘了条件拆分中没有数字测试。您应该做的是添加一个派生列转换,将数量字段转换为整数。在配置错误输出对话框中,将错误和截断值设置为忽略失败。如果数据不是数字,这将通过新字段的值为 NULL 的项目。之后,在条件拆分中,检查新字段是否为空。具有空字段的记录进入 wrongcsvtable,其他记录进入 csvtable

      【讨论】:

      • 我是 SSIS 开发的新手,你能解释一下如何检查条件吗?帮助我。
      猜你喜欢
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2012-04-03
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多