如何在使用SSIS导入数据库之前验证CSV文件?

时间:2011-06-24 07:14:54

标签: ssis

我有三列的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

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

2 个答案:

答案 0 :(得分:18)

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

分步流程:

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

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

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

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

  5. 在软件包的“数据流”标签上,放置Flat File Source并按照屏幕截图# 9 和# 10 所示进行配置。< / p>

  6. 在软件包的“数据流”标签上,进行Data Conversion转换并按照屏幕截图# 11 中的配置进行配置。点击Configure Error Output,将错误截断列值从失败组件更改为重定向行 。请参阅屏幕截图# 12

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

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

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

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

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

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

  13. 希望有所帮助。

    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:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

    屏幕截图#12:

    12

    屏幕截图#13:

    13

    屏幕截图#14:

    14

    屏幕截图#15:

    15

    屏幕截图#16:

    16

    屏幕截图#17:

    17

    屏幕截图#18:

    18

    屏幕截图#19:

    19

    屏幕截图#20:

    20

答案 1 :(得分:1)

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

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