Выберите из таблицы DB2 и вставьте в таблицу SQL - PullRequest
0 голосов
/ 24 апреля 2009

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

У меня есть проект .Net C #, который проверяет определенные таблицы на соответствие стандартам компании, которых они должны придерживаться. Таблицы могут быть на SQL Server или DB2. Когда таблица первоначально добавляется в программу, я собираю метаданные / информацию о таблице, используя операторы выбора либо из information_schema.columns для sql, либо syscat.columns для db2. Как только я получу эти данные, я сохраню их в таблице (назовем ее all_table_information) на сервере sql, содержащей ту же информацию для каждой таблицы, которая проверяется в программе.

Если таблица является таблицей SQL, я могу выполнить этот запрос (конечно, ограничив его только столбцами из таблицы, которую я хочу):

insert into [all_table_information]
    (table_id, column_name, data_type, max_char_length)
select table_id, column_name, data_type, character_maximum_length
    from information_schema.columns 
    where ...restrict to needed table...

И затем выполните это в SqlCommand. Но если это таблица DB2, я должен выполнить этот запрос (снова ограниченный столбцами, которые мне нужны):

select tabschema, tabname, colname, typename, length 
from syscat.columns 
where ...restrict to needed table...

Затем возьмите DataReader с результатами и пройдитесь по нему, вставляя каждую строку, используя:

while (dr.Read())
{
   insert into [all_table_information]
   (table_id, column_name, data_type, max_char_length) values 
   (..."'" + dr["whatever"] + "', '" + ....)

   ...execute sql here...

} 
dr.Close();

Делать это таким образом работает, но это медленно, поэтому мне просто интересно, есть ли еще способ сделать это в одном утверждении? Я знаю, что вы также можете сохранить информацию таблицы db2 в таблицу данных, но можете ли вы выполнить запрос непосредственно к таблице данных?

Спасибо, Райан

Ответы [ 3 ]

1 голос
/ 24 апреля 2009

Лучше создать свой SqlCommand вне dr.Read() и использовать параметры. Это повысит производительность и безопасность, и вам не придется беспокоиться о правильном формировании синтаксиса динамически. Вот так ...

SqlCommand insertCommand = new SqlCommand(connection);

insertCommand.CommandText = @"
insert into [all_table_information]
(table_id, column_name, data_type, max_char_length)
values
(@table_id, @column_name, @data_type, @max_char_length)";

...create your parameters and add them here

insertCommand.Prepare(); //precompiles the query
while (dr.Read())
{
    ...set parameter values

    insertCommand.ExecuteNonQuery();
} 
dr.Close();
1 голос
/ 24 апреля 2009

Вы, вероятно, хотите использовать SqlBulkCopy: MSDN

Это намного быстрее, чем делать отдельные вставки для каждой строки.

1 голос
/ 24 апреля 2009

Рассматривали ли вы использование SSIS вместо написания приложения для этого?

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