Как проверить файл CSV перед импортом в базу данных с помощью служб 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 ответов


вот один из возможных вариантов. Вы можете достичь этого, используя Data Conversion преобразование в Data Flow Task. Следующий пример показывает, как этого можно достичь. В примере используется SSIS 2005 с базой данных SQL Server 2008.

шаг за шагом процесс:

  1. создайте файл с именем FlatFile.CSV и заполнить его данными, как показано на скриншоте #1.

  2. в базе данных SQL, создайте две таблицы имени dbo.CSVCorrect и dbo.CSVWrong использование скриптов, предусмотренных SQL-скриптов. Поля в таблице dbo.CSVWrong должны иметь типы данных тип varchar или аргумент или чар чтобы он мог принимать недопустимые записи.

  3. в пакете служб SSIS создайте соединение OLE DB с именем SQLServer для подключения к базе данных 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, и и усечение значения столбцов из сбой компонента to перенаправить строку. Смотрите скриншот #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

скриншот #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


поместите условное разделение в поток данных. Проверьте, не является ли количество нецелым. Созданная вами ветвь перейдет в wrongcsvtable и ветка по умолчанию перейдет в csvtable

редактировать забыл, что в условном разбиении нет числового теста. Что вам нужно сделать, так это добавить производное преобразование столбца, которое преобразует поле quantity в целое число. В диалоговом окне Настройка вывода ошибок задайте значения ошибки и усечения игнорировать неудачи. Это передаст элемент со значением для нового поля как NULL, если данные не являются числовыми. После этого в условном разбиении проверьте, является ли новое поле null или нет. Записи с нулевым полем идут в wrongcsvtable другие записи, перейдите к csvtable.