SQL 大容量复制不适用于稀疏列
本文关键字:适用于 不适用 大容量 复制 SQL | 更新日期: 2023-09-27 18:34:43
我正在使用C#的SQLBulkCopy类将多行插入SQL Server 2008 R2。它适用于普通表。但不适用于具有稀疏列的表。
我是否需要为 SQLBulkCopy 中的稀疏列设置任何额外的设置?
我的代码:
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.KeepIdentity, null))
{
foreach (DataColumn item in objectData.Columns)
{
sqlBulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);
}
sqlBulkCopy.DestinationTableName = "[" + tableName + "]";
sqlBulkCopy.WriteToServer(objectData);
}
我收到此错误:
给定的列映射与源或目标中的任何列都不匹配
在大容量复制中,列名将区分大小写。因此,如果您确定源和目标都有列,请检查列的名称是否匹配。如果源中分配的列名称是"帐户",目标列名称是"帐户",则无法正常工作。
这不是因为稀疏列。我刚刚创建了测试应用程序,它将数据插入到具有稀疏列的表中,没有问题。看起来其中一个数据列名称在 sql 表中没有相应的列。
CREATE TABLE TestSparse ( ID INT PRIMARY KEY , Descript VARCHAR(20) SPARSE NULL , Rate INT SPARSE NULL )
namespace ConsoleApplication8
{
public class Test
{
public int ID;
public string Descript;
public int? Rate;
}
class Program
{
public static DataTable ToDataTable(List<Test> items)
{
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Descript", typeof(string));
table.Columns.Add("Rate", typeof(int));
foreach (Test item in items)
{
DataRow row = table.NewRow();
row["ID"] = item.ID;
row["Descript"] = item.Descript;
if (item.Rate.HasValue) row["Rate"] = item.Rate;
else row["Rate"] = DBNull.Value;
table.Rows.Add(row);
}
return table;
}
static void Main(string[] args)
{
var list = new List<Test>();
list.Add(new Test() { ID = 4, Descript = "1", Rate = 1 });
list.Add(new Test() { ID = 5, Descript = "2", Rate = 2 });
list.Add(new Test() { ID = 6, Descript = "3", Rate = 3 });
list.Add(new Test() { ID = 7 });
list.Add(new Test() { ID = 8, Descript = "3", Rate = 3 });
list.Add(new Test() { ID = 9, Descript = "3", Rate = 3 });
var Context = new Entities();
SqlConnection ec = (SqlConnection)Context.Database.Connection;
var copy = new SqlBulkCopy(ec, SqlBulkCopyOptions.CheckConstraints, null);
copy.DestinationTableName = "dbo.TestSparse";
copy.ColumnMappings.Add("ID", "ID");
copy.ColumnMappings.Add("Descript", "Descript");
copy.ColumnMappings.Add("Rate", "Rate");
ec.Open();
var table = ToDataTable(list);
copy.WriteToServer(table);
copy.Close();
}
}
}
我认为
,这不是因为稀疏的列。您的表中是否有任何列集?
如果表具有column_set,则稀疏列不会作为不同列进行处理。所有稀疏列的值都包含在column_set的值中,该值的导出方式与 XML 列相同;也就是说,如果绑定为二进制类型,则为 varbinary(max(,如果绑定为 char 或 wchar 类型,则为 nvarchar(max(。导入时,column_set值必须符合column_set的架构。
您可以在此处找到更多详细信息SQL Server 本机客户端中的稀疏列支持