当我使用select * from [table_name]
和另一个表名进行批量插入时出现此错误:
the locale id '0' of the source column 'PAT_NUM_ADT' and the locale id '1033'
of the destination column 'PAT_ID_OLD' do not match
我尝试重置我的数据库排序规则,但这没有帮助。
有没有人见过这个错误?
答案 0 :(得分:6)
如果要将一组完整的字段从一个表复制到另一个表,无论该表是在世界上的另一个域中,还是在同一个数据库中并置,您只需按顺序选择它们。 SqlBulkCopyColumnMappings不起作用。是的,我试过了。我使用了所有四种可能的构造函数,并将它们用作SqlBulkCopyMapping对象,只是通过向SqlBulkCopy.ColumnMappings.Add的Add方法提供相同的信息。
我的列名称相同。如果您使用的是其他名称以及不同的订单,您可能会发现必须实际重命名列。祝你好运。
答案 1 :(得分:6)
批量复制某些数据时,我刚收到此错误消息。虽然它可能不是你遇到的完全相同的问题,但我得到了同样的错误。
具体来说,我正在做以下事情: SELECT NULL AS ColumnName ...
目的地是一个可以为空的varchar(3)。
在这种情况下,我需要做的就是更新我的select语句,如下所示: SELECT CONVERT(VARCHAR(3),NULL)AS ColumnName ...
这完美无缺,错误消息消失了!
答案 2 :(得分:5)
当我们使用SqlBulkCopy时,有时会出现错误,这是使用SqlBulkCopy时映射列的最佳方法。
我以前的代码:
SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder("Data Source=ServerName;User Id=userid;Password=****;Initial Catalog=Deepak; Pooling=true; Max pool size=200; Min pool size=0");
SqlConnection con = new SqlConnection(cb.ConnectionString);
SqlCommand cmd = new SqlCommand("select Name,Class,Section,RollNo from Student", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
SqlBulkCopy sbc = new SqlBulkCopy("Data Source=DestinationServer;User Id=destinationserveruserid;Password=******;Initial Catalog=DeepakTransfer; Pooling=true; Max pool size=200; Min pool size=0");
sbc.DestinationTableName = "StudentTrans";
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
守则给我的错误是: 源列“RollNo”的区域设置ID“0”和目标列“Section”的区域设置ID“1033”不匹配。
现在,在列映射后,我的代码正在成功运行。
我的修改代码是:
SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder("Data Source=ServerName;User Id=userid;Password=****;Initial Catalog=Deepak;");
SqlConnection con = new SqlConnection(cb.ConnectionString);
SqlCommand cmd = new SqlCommand("select Name,Class,Section,RollNo from Student", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
SqlBulkCopy sbc = new SqlBulkCopy("Data Source=DestinationServer;User Id=destinationserveruserid;Password=******;Initial Catalog=DeepakTransfer;");
sbc.DestinationTableName = "StudentTrans";
sbc.ColumnMappings.Add("Name", "Name");
sbc.ColumnMappings.Add("Class", "Class");
sbc.ColumnMappings.Add("Section", "Section");
sbc.ColumnMappings.Add("RollNo", "RollNo");
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
此代码正在成功运行。
答案 3 :(得分:1)
sal的答案
如果您的复印件少于一整箱 从一个表到的字段集 另一个,是否该表是打开的 世界上另一个域名,或者是 你在同一个数据库中并置 只需要按顺序选择它们。 SqlBulkCopyColumnMappings不起作用。
根据我的工作绝对正确!谢谢你发布它。一切都必须相同 - 数据类型等。每次发现不匹配时,它都会抛出神秘的Locale Id错误 - 有趣但令人沮丧的是h ###。
答案 4 :(得分:1)
我遇到了同样的错误,结果发现我正在从DataTable中的VARCHAR列复制到INT。
我改变数据类型后,它完美无缺。我成功复制了字段子集,指定了正确的字段映射(字段名称或序列号都有映射)。
因此请确保您的数据类型正确无误。
答案 5 :(得分:0)
我会检查您的默认语言环境设置是什么。此外,您需要使用sp_help检查两个表的区域设置以验证它们是否相同。如果不是,则需要将其转换为正确的区域设置
答案 6 :(得分:0)
当您更改数据库的排序规则时,表列保留旧排序规则,因此您需要删除表并再次创建它们。
答案 7 :(得分:0)
一种调试此错误的好方法是将SqlBulkCopy中使用的sql查询作为选择插入并在Management Studio中运行,例如,将select * from [table_name]
更改为select * into newTable from [table_name]
,然后查看的可空性和数据类型为“ newTable”和“ table_name”。如果存在任何差异,那么您很可能会遇到这个误导性错误。调整查询或目标表,直到它们匹配为止,然后您的命令将起作用。
答案 8 :(得分:0)
非常感谢Deepak Dwivedi的帮助。以下是 COLLATE DATABASE_DEFAULT 的更多破解方法,最终为我解决了问题:
SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder("Data Source=ServerName;User Id=userid;Password=****;Initial Catalog=Deepak;");
SqlConnection con = new SqlConnection(cb.ConnectionString);
SqlCommand cmd = new SqlCommand("select Name COLLATE DATABASE_DEFAULT Name ,Class COLLATE DATABASE_DEFAULT Class ,Section COLLATE DATABASE_DEFAULT Section ,RollNo COLLATE DATABASE_DEFAULT RollNo from Student", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
SqlBulkCopy sbc = new SqlBulkCopy("Data Source=DestinationServer;User Id=destinationserveruserid;Password=******;Initial Catalog=DeepakTransfer;");
sbc.DestinationTableName = "StudentTrans";
sbc.ColumnMappings.Add("Name", "Name");
sbc.ColumnMappings.Add("Class", "Class");
sbc.ColumnMappings.Add("Section", "Section");
sbc.ColumnMappings.Add("RollNo", "RollNo");
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();