Как динамически отобразить входные и выходные столбцы в SSIS? - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно загружать данные в SQL Server из файлов .dbf через SSIS.Мой выходной столбец исправлен, но входной столбец не исправлен, поскольку файлы поступают от клиента, и клиент может обновлять данные в своем собственном стиле.может также быть какой-то неиспользуемый столбец, или имя входного столбца может отличаться от выходного столбца.

Одна мысль, которая у меня возникла, заключалась в том, чтобы сопоставить входной столбец файлов с выходным столбцом в таблице базы данных SQL и использовать только те столбцы, которыеприсутствует в строке для идентификатора файла.

Но я не понимаю, как это сделать.Можете ли вы предложить мне сделать то же самое, или у вас есть идеи?

Пример таблицы.

+--------+---------------+--------------+--------+ | FileID | InputColumn | OutputColumn | Active | +--------+---------------+--------------+--------+ | 1 | CustCd | CustCode | 1 | +--------+---------------+--------------+--------+ | 1 | CName | CustName | 1 | +--------+---------------+--------------+--------+ | 1 | Address | CustAdd | 1 | +--------+---------------+--------------+--------+ | 2 | Cust_Code | CustCode | 1 | +--------+---------------+--------------+--------+ | 2 | Customer Name | CustName | 1 | +--------+---------------+--------------+--------+ | 2 | Location | CustAdd | 1 | +--------+---------------+--------------+--------+

1 Ответ

0 голосов
/ 21 февраля 2019

Если вы создаете похожую таблицу, вы можете использовать ее в двух подходах для динамического сопоставления столбцов в пакете служб SSIS, или вы должны построить весь пакет программно.В этом ответе я попытаюсь дать вам некоторое представление о том, как это сделать.

(1) Построение исходной SQL-команды с псевдонимами

Примечание: этот подход будет толькоработает, если все .dbf файлы имеют одинаковое количество столбцов, но имена различаются

При таком подходе вы создадите команду SQL, которая будет использоваться в качестве источника, на основе FileID и созданной вами таблицы сопоставления,Вы должны знать, что FileID и путь к файлу .dbf хранятся в переменной.как пример:

Предполагая, что именем таблицы является inputoutputMapping

Добавьте задачу «Выполнение SQL» с помощью следующей команды:

DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT '

SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?

SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))

SELECT @strQuery

И вНа вкладке «Сопоставление параметров» выберите переменную, содержащую FileID для сопоставления с параметром 0, а переменную, содержащую имя файла .dbf (альтернативу имени таблицы), параметру 1

. Установите ResultSetнаберите Single Row и сохраните ResultSet 0 внутри переменной типа string как пример @[User::SourceQuery]

Значение ResultSet будет следующим:

SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1

В OLEDB Source выберите переменную доступа к таблице для команды SQL из переменной и используйте переменную @[User::SourceQuery] в качестве источника.


(2) Использование компонента сценария в качестве источника

В этом подходе вы должныиспользовать компонент скрипта в качестве источника внутри задачи потока данных:

Прежде всего, вам нужно передать путь файла .dbf и соединение SQL Server с компонентом скрипта через переменные, если вы не хотитеНе для того, чтобы жестко их кодировать.

Внутри редактора сценариев вы должны добавить выходной столбец для каждого столбца, найденного в таблице назначения, и сопоставить их с пунктом назначения .

Внутри скрипта вы должны прочитать файл .dbf в таблицу данных:

После загрузки данных в таблицу данных также заполните другую таблицу данных данными, найденными в таблице MappingTable, созданной вами в SQL Server.

После этого выполните цикл по столбцам с данными и замените .ColumnName на соответствующий выходной столбец, например:

foreach (DataColumn col in myTable.Columns)
    {

    col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First(); 

    }

После цикла по каждой строке в таблице данных и создайте строку вывода сценария.

Кроме того, обратите внимание, что при назначении выходных строк необходимо проверить, существует ли столбец, можно сначала добавить все имена столбцов в список строк, а затем использовать его для проверки, например:

var columnNames = myTable.Columns.Cast<DataColumn>()
                             .Select(x => x.ColumnName)
                             .ToList();  


foreach (DataColumn row in myTable.Rows){

if(columnNames.contains("CustCode"){

    OutputBuffer0.CustCode = row("CustCode");

}else{

    OutputBuffer0.CustCode_IsNull = True

}

//continue checking all other columns

}

Если вам нужно больше информации оиспользуя компонент сценария в качестве источника, затем проверьте одну из следующих ссылок:


(3) Динамическое построение пакета

Я не думаю, что есть другие методы, которые можно использовать для достижения этой цели, кроме того, что у вас есть выбор для динамической сборки пакета, тогда вам следуетидти с:


(4) SchemaMapper: библиотека классов отображения схемы C #

Недавно я начал новый проект на Git-Hub, который представляет собой библиотеку классов, разработанную с использованием C #.Вы можете использовать его для импорта табличных данных из Excel, Word, PowerPoint, Text, CSV, HTML, JSON и XML в таблицу сервера SQL с другим определением схемы с использованием подхода сопоставления схемы.проверить это по адресу:

Вы можете следовать этой странице вики для пошагового руководства:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...