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

发布于 2024-11-17 02:49:09 字数 1076 浏览 0 评论 0原文

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

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

I have CSV file with three columns.

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

Table in the SQL Server database is as following/

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

I created an SSIS package to import csv file data into the database table. I am getting an error during package execution because the quantity is a string. I created another table to store the invalid data.

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

In the csvtable, I would like to store the following data.

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

In the wrongcsvtable, I would like to store the following data.

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

Could someone point me in the right direction to achieve the above mentioned output?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

枕梦 2024-11-24 02:49:09

这是一种可能的选择。您可以使用数据流任务中的数据转换转换来实现此目的。以下示例展示了如何实现这一点。该示例使用 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。配置平面文件连接 CSV,如屏幕截图 #3 - #7 所示。平面文件连接中的所有列应配置为字符串数据类型,以便包在读取文件时不会失败。

  4. 在包的“控制流”选项卡上,放置一个数据流任务,如屏幕截图 #8 所示。

  5. 在包的“数据流”选项卡上,放置一个平面文件源并按屏幕截图 #9 和 #10 中所示进行配置.

  6. 在包的“数据流”选项卡上,放置一个数据转换转换并对其进行配置,如屏幕截图#11所示。单击配置错误输出并将错误截断列值从失败组件更改为重定向行。请参阅屏幕截图 #12

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

  8. 在包的“数据流”选项卡上,放置另一个 OLE DB 目标 并将红色箭头从数据转换连接到此 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

屏幕截图 #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:< /strong>

19

屏幕截图 #20:

20

Here is one possible option. You can achieve this using the Data Conversion transformation within the Data Flow Task. Following example shows how this can be achieved. The example uses SSIS 2005 with SQL Server 2008 database.

Step-by-step process:

  1. Create a file named FlatFile.CSV and populate it with data as shown in screenshot #1.

  2. In the SQL database, create two tables named dbo.CSVCorrect and dbo.CSVWrong using the scripts provided under SQL Scripts section. The fields in the table dbo.CSVWrong should have the data types VARCHAR or NVARCHAR or CHAR so that it can accept the invalid records.

  3. On the SSIS package, create an OLE DB connection named SQLServer to connect to SQL Server database and create a Flat File Connection named CSV. Refer screenshot #2. Configure the flat file connection CSV as shown in screenshots #3 - #7. All the columns in the flat file connection should be configured as string data type so that the package doesn't fail while reading the file.

  4. On the Control Flow tab of the package, place a Data Flow Task as shown in screenshot #8.

  5. On the Data Flow tab of the package, place a Flat File Source and configure it as shown in screenshots #9 and #10.

  6. On the Data Flow tab of the package, place a Data Conversion transformation and configure it as shown in screenshot #11. Click on the Configure Error Output and change the Error and Truncation column values from Fail component to Redirect row. Refer screenshot #12.

  7. On the Data Flow tab of the package, place an OLE DB Destination and connect the green arrow from Data Conversion to this OLE DB Destination. Configure the OLE DB Destination as shown in screenshots #13 and #14.

  8. On the Data Flow tab of the package, place another OLE DB Destination and connect the red arrow from Data Conversion to this OLE DB Destination. Configure the OLE DB Destination as shown in screenshots #15 and #16.

  9. Screenshot #17 shows the Data Flow Task once it has been completely configured.

  10. Screenshot #18 shows data in the tables before the package execution.

  11. Screenshot #19 shows package execution within Data Flow Task.

  12. Screenshot #20 shows data in the tables after the package execution.

Hope that helps.

SQL Scripts:

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

Screenshot #1:

1

Screenshot #2:

2

Screenshot #3:

3

Screenshot #4:

4

Screenshot #5:

5

Screenshot #6:

6

Screenshot #7:

7

Screenshot #8:

8

Screenshot #9:

9

Screenshot #10:

10

Screenshot #11:

11

Screenshot #12:

12

Screenshot #13:

13

Screenshot #14:

14

Screenshot #15:

15

Screenshot #16:

16

Screenshot #17:

17

Screenshot #18:

18

Screenshot #19:

19

Screenshot #20:

20

转身泪倾城 2024-11-24 02:49:09

在数据流中放置条件分割。检查数量是否不完整。您创建的分支将转到wrongcsvtable,默认分支将转到csvtable

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

Put a conditional split in your data flow. Check if quantity is non-integral. The branch you've created will go to the wrongcsvtable and the default branch will go to the csvtable

EDIT Forgot there is no numeric test in the conditional split. What you should do is add a derived column transform that converts the quantity field into an integer. In the Configure Error Output dialog, set the error and truncation values to Ignore Failure. This will pass the item through with the value for the new field as NULL if the data is not numeric. After that, in the conditional split, check if the new field is null or not. Records with a null field go to the wrongcsvtable, other records go to the csvtable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文