SqlBulkCopy 数据类型转换

Posted

技术标签:

【中文标题】SqlBulkCopy 数据类型转换【英文标题】:SqlBulkCopy datatypes conversion 【发布时间】:2018-10-04 12:29:06 【问题描述】:

我有两个数据库表,它们具有相同的列,但它们的数据类型不同(例如:“检查”列在表 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”不匹配。

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

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以使用 CAST() 语句对源选择进行转换。 但是,如果目标连接可以访问源数据库,那么与执行 SqlBulkCopy 相比,单个“insert into 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);

【讨论】:

谢谢!我已将演员添加到我的专栏中,效果很好:)【参考方案2】:

可能不是您所期望的,但是对于简单地根据另一个表的行更新一个表,可以使用基本的 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 关键字可能就是您要查找的内容。

【讨论】:

以上是关于SqlBulkCopy 数据类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用SqlBulkCopy类批量复制大数据

SQL批量插入出现 类型转换错误

用NOPI将上传的EXCEL,转换得到DataTable,用SqlBulkCopy将数据写入数据库表中,配置添加默认列及值,对应数据库字段写入数据

SqlBulkCopy只支持SQL Server? EF Core实现支持多数据库类型的Bulk Copy

Java数据类型转换:强制类型转换+自动类型转换

C++ 数据类型转换