SqlBulkCopy数据类型转换

时间:2018-10-04 12:29:06

标签: c# sql asp.net sql-server

我有两个DB表,它们具有相同的列,但是它们的数据类型不同(例如:“ Check”列在表1中为整数类型,但在表2中为varchar)。我正在尝试使用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);
    } 

我说错了

  

源列“ CHECK”的语言环境ID“ 0”和语言环境ID   目标列“ CHECK”的“ 1033”不匹配。

这是由于表之间的数据类型不同而发生的。如何在之前的代码中进行数据类型转换?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用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);

答案 1 :(得分:0)

可能不是您所期望的,而是仅根据另一个表的行更新一个表,就可以使用基本的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关键字。