源列“PAT_NUM_ADT”的区域设置ID“0”和目标列“PAT_ID_OLD”的区域设置ID“1033”不匹配

时间:2008-09-19 15:09:06

标签: sql-server locale

当我使用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

我尝试重置我的数据库排序规则,但这没有帮助。

有没有人见过这个错误?

9 个答案:

答案 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();