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

kan*_*nth 6 ssis

我有三列CSV文件.

sno  sname  quantity
---  -----  --------
 1   aaa    23
 2   bbb    null
 3   ccc    34
 4   ddd    ddd
 5   eee    xxx
 6   fff    87
Run Code Online (Sandbox Code Playgroud)

SQL Server数据库中的表如下/

CREATE TABLE csvtable
(       sno         int
    ,   sname       varchar(100)
    ,   quantity    numeric(5,2)
)
Run Code Online (Sandbox Code Playgroud)

我创建了一个SSIS包来将csv文件数据导入数据库表.我在包执行期间收到错误,因为数量是一个字符串.我创建了另一个表来存储无效数据.

CREATE TABLE wrongcsvtable
(       sno         nvarchar(10)
    ,   sname       nvarchar(100)
    ,   quantity    nvarchar(100)
)
Run Code Online (Sandbox Code Playgroud)

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

sno  sanme   quantity
---  ------  --------
 1   aaa     23
 3   ccc     34
 6   fff     87
Run Code Online (Sandbox Code Playgroud)

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

sno  sanme   quantity
---  ------  --------
 2   bbb     null
 4   ddd     ddd
 5   eee     xxx
Run Code Online (Sandbox Code Playgroud)

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

小智 18

这是一个可能的选择.你可以使用内部的Data Conversion转换来实现这一点Data Flow Task.以下示例显示了如何实现这一目标.该示例使用SSIS 2005和SQL Server 2008数据库.

分步过程:

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

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

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

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

  5. 在程序包的"数据流"选项卡上,放置Flat File Source并配置它,如屏幕截图#9和#10所示.

  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显示了包执行后表中的数据.

希望有所帮助.

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
Run Code Online (Sandbox Code Playgroud)

截图#1:

1

截图#2:

2

截图#3:

3

截图#4:

4

截图#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