Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 源列“PAT_NUM_ADT”的区域设置id“0”与目标列“PAT_id_OLD”的区域设置id“1033”不匹配_Sql Server_Locale - Fatal编程技术网

Sql server 源列“PAT_NUM_ADT”的区域设置id“0”与目标列“PAT_id_OLD”的区域设置id“1033”不匹配

Sql server 源列“PAT_NUM_ADT”的区域设置id“0”与目标列“PAT_id_OLD”的区域设置id“1033”不匹配,sql-server,locale,Sql Server,Locale,当我使用[table_name]中的select*和另一个表名执行大容量插入时,会出现此错误: 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 我试图重置我的数据库排序规则,但这没有帮助 有人看到这个错误吗?我会检查您的默认语言环境设置是什么。此外,还需要使用sp_help检查两个表

当我使用[table_name]中的select*和另一个表名执行大容量插入时,会出现此错误:

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
我试图重置我的数据库排序规则,但这没有帮助


有人看到这个错误吗?

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

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

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

萨尔的答案


如果您复制的内容少于一个完整的 从一个表到另一个表的字段集 另一个问题,那张桌子是否开着 世界上的另一个领域,或者是 并置在同一数据库中,则 只需按顺序选择它们。 SqlBulkCopyColumnMappings不起作用


是根据我的工作绝对正确!谢谢你发帖。所有内容都必须相同—数据类型等。每次发现不匹配时,都会抛出神秘的区域设置Id错误—有趣但令人沮丧,就像h一样。

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

当我们使用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();

此代码正在成功运行。

我刚刚在批量复制某些数据时收到此错误消息。虽然这可能不是你遇到的完全相同的问题,但我得到了相同的错误

具体来说,我做了以下工作: 选择NULL作为ColumnName

目的地是一个可为空的varchar3

在这种情况下,我所需要做的就是更新select语句,如下所示: 选择CONVERTVARCHAR3,空作为ColumnName


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

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

在我更改了数据类型之后,它工作得非常完美。我成功地复制了字段子集,指定了由字段名或序列号处理的正确字段映射


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

调试此操作的一个好方法是将SqlBulkCopy中使用的sql查询作为选择项在management studio中运行,例如,将select*从[table_name]更改为select*从[table_name]更改为newTable,然后看看“newTable”和“table_name”的可空性和数据类型。如果存在任何差异,那么您很可能最终会出现这种误导性错误。调整查询或目标表,直到它们匹配为止,然后您的命令就会工作。

非常感谢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();

SqlBulkCopy似乎正在接受IDataReader,但正在检查它是否是SqlDataReader,并对其进行特殊处理。如果您创建一个包装器/装饰器类,该类只将IDataReader接口调用转发给底层的SqlDataReader,所有的工作都是正确的。这正是问题的根源——我在目标表的中间添加了一个不在源表中的列,批量复制假设源和目的是完全相同的,而不是试图通过将源列命名为目标列来映射。谢谢你的解释@兰迪尔,谢谢!你的解决方案奏效了。所有其他解决方案都建议填充数据表,这显然会降低性能