Задача сценария служб SSIS: выбор из datatable1 в datatable2

Я использую SQL 2014, Visual Studio 2013. У меня есть следующий код, который является частью более крупной задачи сценария:

//Load DataTable1 with Source Excel Sheet Data
OleDbCommand oconn = new OleDbCommand("select * from [" + sheetname + "]", cnn);
OleDbDataAdapter adp = new OleDbDataAdapter(oconn);
DataTable dt = new DataTable();
adp.Fill(dt);

Далее я хотел бы выбрать целевое количество столбцов из таблицы данных1 и заполнить другую таблицу данных. Что-то вроде этого:

//Load another DataTable with Data from datatable1
OleDbCommand oconn2 = new OleDbCommand("select [column1], [column2] from datatable1", cnn);
OleDbDataAdapter adp2 = new OleDbDataAdapter(oconn2);
DataTable dt2 = new DataTable();
adp2.Fill(dt2);

Это возможно? Причина этого сложна, но я не знаю другого способа обойти это. Мои исходные файлы Excel. Таким образом, данные должны быть внесены в таблицу данных. Затем имена столбцов необходимо изменить. Затем можно составить таблицу с измененными именами столбцов. Но сначала данные должны быть внесены в таблицу данных как есть, так как я не уверен, что хочу изменять исходные файлы.

Спасибо.


person Craig    schedule 13.12.2018    source источник
comment
Зачем вам нужно изменять имена столбцов? Чего именно вы пытаетесь достичь?   -  person shree.pat18    schedule 13.12.2018
comment
@shree: эти исходные файлы являются артефактами, полученными из приложения для судебной экспертизы, а имена столбцов - в основном даты - имеют в имени метки времени (например, UTC, PST). Есть и другие случаи, когда в именах столбцов есть посторонние символы. Я хотел бы удалить это и нормализовать имена этих столбцов перед созданием таблиц в SQL. Конечным результатом является то, что у меня есть хранимые процедуры, которые выполняются из этих таблиц, и нормализация имен столбцов имеет важное значение.   -  person Craig    schedule 13.12.2018
comment
Под отметками времени вы имеете в виду имена столбцов, такие как 13-12-2018 00:00:00UTC, то есть имена столбцов меняются каждый раз? Кроме того, вы создаете таблицы БД на лету или они уже существуют?   -  person shree.pat18    schedule 13.12.2018
comment
Да, имена выглядят примерно так: Дата/время последнего изменения файловой системы — UTC+00:00 (M/d/yyyy). Следующий файл может содержать дату и время последнего изменения файловой системы — PST-08:00 (M/d/yyyy). Мне нужно одно поле, которое гласит: Дата/время последнего изменения файловой системы. БД уже существует, это таблицы, которые нужно создавать на лету. После того, как таблица создана и поле настроено так, как я хочу (нормализовано), любые последующие данные можно легко выровнять и вставить.   -  person Craig    schedule 13.12.2018
comment
Хм, в этом случае вы можете переименовать столбцы в самой первой таблице данных. Взгляните на это: stackoverflow .com/questions/6407239/   -  person shree.pat18    schedule 13.12.2018
comment
Да, но затем мне нужно запросить эту таблицу данных для выбора столбцов, используя эти новые имена столбцов. Отсюда моя дилемма.   -  person Craig    schedule 13.12.2018
comment
Извините, не могу общаться в чате из-за ограничений на работе. Но если вы переименуете столбцы, должно быть просто сопоставить имена целевых столбцов БД, если только я не пропустил какой-то другой шаг в вашем рабочем процессе?   -  person shree.pat18    schedule 13.12.2018
comment
Хорошо спасибо. Возможно, мне нужно переосмыслить это.   -  person Craig    schedule 13.12.2018
comment
Определите свою таблицу данных и обратитесь к своему источнику, используя порядковые номера. Это предполагает, что ваш источник имеет ту же структуру столбцов.   -  person KeithL    schedule 13.12.2018
comment
Почему бы вам не использовать встроенные инструменты для импорта данных из ваших файлов Excel, а затем сопоставить данные с вашим местом назначения? За исключением этого, почему бы не разделить задачу сценария так, чтобы она заполняла таблицу ADO.NET, которую можно использовать в задаче потока данных для вставки в место назначения. Тогда остальная часть вашей задачи сценария может выполняться после ДПФ.   -  person digital.aaron    schedule 13.12.2018
comment
@digital.aaron: я буду создавать таблицу с нормализованными столбцами. Когда я получу новые файлы, мне нужно будет сравнить поля этих новых файлов с полями таблицы, которую я создал из первого файла - имена полей должны совпадать, иначе вставка не удастся. Также я не хочу сопоставлять данные — поля в этих исходных файлах не только меняются, но и могут быть в разном порядке. Мне нужно, чтобы это было более динамично.   -  person Craig    schedule 13.12.2018
comment
Я думаю, что решение может быть просто таким: я импортирую данные в таблицу данных или, альтернативно, объектную переменную/набор результатов из исходного файла Excel. Затем измените имена столбцов по мере необходимости. Затем мне нужно сослаться (выбрать из) эту таблицу данных, как показано в моем примере выше - я просто не знаю, как это сделать.   -  person Craig    schedule 13.12.2018


Ответы (1)


Определите второй DataTable, используя типы данных и новые имена для столбцов, которые будут к нему добавлены. Затем вы можете заполнить этот объект, используя порядковое положение столбцов в начальном DataTable с помощью метода Add, как показано ниже.

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("NewColumnName1", typeof(int));
            dt2.Columns.Add("NewColumnName2", typeof(string));

            //in this example dt is the original DataTable
            foreach (DataRow dr in dt.Rows)
            {
                          //add only necessary columns by their
                          //ordinal position in source DataTable
                         dt2.Rows.Add(dr[1], dr[0]);
            }
person userfl89    schedule 17.12.2018