Как проверить файл 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.
шаг за шагом процесс:
создайте файл с именем
FlatFile.CSV
и заполнить его данными, как показано на скриншоте #1.в базе данных SQL, создайте две таблицы имени
dbo.CSVCorrect
иdbo.CSVWrong
использование скриптов, предусмотренных SQL-скриптов. Поля в таблицеdbo.CSVWrong
должны иметь типы данных тип varchar или аргумент или чар чтобы он мог принимать недопустимые записи.в пакете служб SSIS создайте соединение OLE DB с именем SQLServer для подключения к базе данных SQL Server и создайте соединение с плоским файлом CSV. Смотрите скриншот #2. Настройте соединение с плоским файлом CSV, как показано на скриншотах #3 - #7. Все столбцы в соединении с плоским файлом должны быть настроены как строка тип данных, чтобы пакет не сбой при чтении файла.
на вкладке поток управления пакета поместите
Data Flow Task
как показано на скриншоте #8.на вкладке "поток данных" пакет, место
Flat File Source
и настройте его, как показано на скриншотах #9 и№10.на вкладке поток данных пакета, поместить
Data Conversion
преобразование и настройте его, как показано на скриншоте #11. Нажмите наConfigure Error Output
, и и усечение значения столбцов из сбой компонента to перенаправить строку. Смотрите скриншот #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:
поместите условное разделение в поток данных. Проверьте, не является ли количество нецелым. Созданная вами ветвь перейдет в wrongcsvtable и ветка по умолчанию перейдет в csvtable
редактировать забыл, что в условном разбиении нет числового теста. Что вам нужно сделать, так это добавить производное преобразование столбца, которое преобразует поле quantity в целое число. В диалоговом окне Настройка вывода ошибок задайте значения ошибки и усечения игнорировать неудачи. Это передаст элемент со значением для нового поля как NULL, если данные не являются числовыми. После этого в условном разбиении проверьте, является ли новое поле null или нет. Записи с нулевым полем идут в wrongcsvtable другие записи, перейдите к csvtable.