我有三列的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
有人能指出我正确的方向来实现上述输出吗?
答案 0 :(得分:18)
这是一个可能的选择。您可以使用Data Conversion
中的Data Flow Task
转换来实现此目的。以下示例显示了如何实现这一目标。该示例将SSIS 2005与SQL Server 2008数据库结合使用。
分步流程:
创建一个名为FlatFile.CSV
的文件,并使用数据填充它,如屏幕截图# 1 所示。
在SQL数据库中,使用 SQL Scripts 部分下提供的脚本创建两个名为dbo.CSVCorrect
和dbo.CSVWrong
的表。表dbo.CSVWrong
中的字段应具有 VARCHAR 或 NVARCHAR 或 CHAR 的数据类型,以便它可以接受无效记录。
在SSIS包上,创建名为SQLServer的OLE DB连接以连接到SQL Server数据库并创建名为CSV的平面文件连接。请参阅屏幕截图# 2 。配置平面文件连接CSV,如屏幕截图# 3 - # 7 所示。平面文件连接中的所有列都应配置为字符串数据类型,以便在读取文件时包不会失败。
在包的“控制流”标签上,放置Data Flow Task
,如屏幕截图# 8 所示。
在软件包的“数据流”标签上,放置Flat File Source
并按照屏幕截图# 9 和# 10 所示进行配置。< / p>
在软件包的“数据流”标签上,进行Data Conversion
转换并按照屏幕截图# 11 中的配置进行配置。点击Configure Error Output
,将错误和截断列值从失败组件更改为重定向行 。请参阅屏幕截图# 12 。
在程序包的“数据流”选项卡上,放置OLE DB Destination
并将绿色箭头从数据转换连接到此OLE DB目标。配置OLE DB目的地,如屏幕截图# 13 和# 14 所示。
在程序包的“数据流”标签上,放置另一个OLE DB Destination
并将红色箭头从数据转换连接到此OLE DB目标。配置OLE DB目的地,如屏幕截图# 15 和# 16 所示。
屏幕截图# 17 会在完成配置后显示数据流任务。
屏幕截图# 18 会在 包执行之前的表格中显示数据。
屏幕截图# 19 显示数据流任务中的包执行。
屏幕截图# 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:
答案 1 :(得分:1)
在数据流中添加条件拆分。检查数量是否为非整数。您创建的分支将转到 wrongcsvtable ,默认分支将转到 csvtable
编辑忘记条件拆分中没有数字测试。您应该做的是添加派生列转换,将数量字段转换为整数。在“配置错误输出”对话框中,将错误和截断值设置为“忽略失败”。如果数据不是数字,这将传递项目,新字段的值为NULL。之后,在条件拆分中,检查新字段是否为空。带有空字段的记录转到 wrongcsvtable ,其他记录转到 csvtable 。