7

当我使用, 和另一个表名进行批量插入时出现此错误: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

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

有没有人看到这个错误?

4

9 回答 9

8

如果您要从一个表复制不到一组完整的字段到另一个,无论该表是在世界各地的另一个域中,还是并置在同一个数据库中,您只需按顺序选择它们。SqlBulkCopyColumnMappings 不起作用。是的,我试过了。我使用了所有四个可能的构造函数,并将它们都用作 SqlBulkCopyMapping 对象,并且只是通过向 SqlBulkCopy.ColumnMappings.Add 的 Add 方法提供相同的信息。

我的列名称相同。如果您使用不同的名称和不同的顺序,您可能会发现您实际上必须重命名列。祝你好运。

于 2010-01-14T19:45:11.940 回答
7

批量复制一些数据时,我刚刚收到此错误消息。虽然它可能与您遇到的问题不完全相同,但我遇到了同样的错误。

具体来说,我正在执行以下操作:SELECT NULL AS ColumnName ...

目标是一个可为空的 varchar(3)。

在这种情况下,我需要做的就是按如下方式更新我的选择语句:SELECT CONVERT(VARCHAR(3),NULL) AS ColumnName...

这工作得很好,错误消息消失了!

于 2012-01-20T21:29:48.063 回答
6

没错,当我们使用 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”和目标列“部分”的区域设置 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();

此代码运行成功。

于 2011-11-24T12:52:56.993 回答
1

萨尔的回答

如果您要从一个表复制不到一组完整的字段到另一个,无论该表是在世界各地的另一个域中,还是并置在同一个数据库中,您只需按顺序选择它们。SqlBulkCopyColumnMappings 不起作用。

根据我的工作是绝对正确的!感谢您发布它。一切都必须相同 - 数据类型等。每次发现不匹配时,它都会抛出神秘的 Locale Id 错误 - 有趣但令人沮丧的是 h###。

于 2010-01-19T22:58:32.267 回答
1

我遇到了同样的错误,结果我正在从 DataTable 中的 VARCHAR 列复制到 INT。

在我更改数据类型后,它完美无缺。我成功复制了字段子集,指定了正确的字段映射(映射由字段名称或序列号工作)。

因此,请确保您的数据类型正确。

于 2018-06-13T14:40:21.387 回答
0

我会检查您的默认语言环境设置是什么。此外,您需要使用 sp_help 检查两个表的语言环境,以验证它们是否相同。如果不是,您需要将其转换为正确的语言环境

于 2008-09-19T15:14:19.757 回答
0

当您更改数据库的排序规则时,表列会保留旧的排序规则,因此您需要删除表并重新创建它们。

于 2011-08-25T10:13:21.787 回答
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();
于 2020-01-10T13:34:52.440 回答
0

调试此问题的一个好方法是将 SqlBulkCopy 中使用的 sql 查询作为选择输入在管理工作室中运行,例如,更改select * from [table_name]select * into newTable from [table_name],然后查看“newTable”与“table_name”的可空性和数据类型'。如果有任何差异,那么您很可能最终会遇到这种误导性错误。调整查询或目标表直到它们匹配,然后您的命令将起作用。

于 2018-12-11T08:08:54.763 回答