Преобразование типов данных SqlBulkCopy - PullRequest
0 голосов
/ 04 октября 2018

У меня есть две таблицы БД, они имеют одинаковые столбцы, но их типы данных различны (например, столбец «Проверка» имеет тип integer в таблице 1, но varchar в таблице 2).Я пытаюсь скопировать данные из одной таблицы в другую с помощью BulkCopy.У меня есть такой код:

using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {

                    cmdSQLT = new SqlCommand("SELECT " + ColumnsNames + " FROM [transfer].[" + SelectedScheme + ".OldTable]", conn);
                    cmdSQLT.CommandTimeout = 1200;
                    reader = cmdSQLT.ExecuteReader();

                     sbc.ColumnMappings.Add("CHECK", "CHECK");

                    sbc.DestinationTableName = "[" + SelectedScheme + "_Newtable]";
                    sbc.BulkCopyTimeout = 1200;
                    sbc.WriteToServer(reader);
    } 

Я получаю сообщение об ошибке:

Идентификатор локали '0' исходного столбца 'CHECK' и идентификатор локали '1033'столбца назначения 'CHECK' не совпадают.

Это происходит из-за различий в типах данных между таблицами.Как я могу выполнить преобразование типов данных в предыдущем коде?

Ваша помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Возможно, это не то, что вы ожидаете, а просто для обновления одной таблицы на основе строк другой таблицы, улучшенная производительность и масштабируемость могут быть достигнуты с помощью базовых операторов INSERT, UPDATE и DELETE.Например:

INSERT tbl_A (col, col2)  
SELECT col, col2   
FROM tbl_B   
WHERE NOT EXISTS (SELECT col FROM tbl_A A2 WHERE A2.col = tbl_B.col);  

Если речь идет о синхронизации столбцов / таблиц, ключевое слово Merge может быть тем, что вы ищете.

0 голосов
/ 04 октября 2018

Вы можете выполнить преобразование при выборе источника с помощью оператора CAST ().Однако, если целевое соединение имеет доступ к исходной базе данных, то вместо выполнения SqlBulkCopy один оператор «вставка в select ... from

» будет гораздо более эффективным решением.

т.е.:

var colNames = ColumnsNames.Split(',').ToArray();
for(int i=0;i< colNames.Length;i++)
{
   if (colNames[i].ToUpper() == "CHECK")
   {
      colNames[i] = "cast(Check as varchar(10))" 
   }
}
ColumnsNames = string.Join(",",colNames);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...