идентификатор локали «0» исходного столбца «PAT_NUM_ADT» и идентификатор локали «1033» столбца назначения «PAT_ID_OLD» не совпадают

Я получаю эту ошибку, когда делаю массовую вставку с 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

Я попытался сбросить параметры сортировки БД, но это не помогло.

Кто-нибудь видел эту ошибку?


person Community    schedule 19.09.2008    source источник


Ответы (9)


Если вы копируете неполный набор полей из одной таблицы в другую, независимо от того, находится ли эта таблица в другом домене по всему миру или находится в той же базе данных, вам просто нужно выбрать их по порядку. SqlBulkCopyColumnMappings не работают. Да, я пытался. Я использовал все четыре возможных конструктора, и использовал их как объекты SqlBulkCopyMapping, так и просто предоставляя ту же информацию методу Add SqlBulkCopy.ColumnMappings.Add.

Мои столбцы называются так же. Если вы используете другое имя, а также другой порядок, вы можете обнаружить, что вам действительно нужно переименовать столбцы. Удачи.

person sal    schedule 14.01.2010
comment
Похоже, что SqlBulkCopy принимает IDataReader, но проверяет, является ли он SqlDataReader, и обрабатывает его особым образом. Если вы создаете класс-оболочку/декоратор, который просто перенаправляет вызовы интерфейса IDataReader базовому SqlDataReader, все работает правильно. - person laindir; 06.08.2013
comment
Это было именно источником проблемы для меня - я добавил столбец в середине целевой таблицы, которого не было в исходной таблице, и массовое копирование предполагало, что и источник, и место назначения были точно идентичными, а не пытались сопоставить назовите исходные столбцы целевыми столбцами. Спасибо за это объяснение! - person Mr. T; 17.08.2016
comment
@laindir Спасибо! Ваше решение сработало. Все другие решения предлагали заполнение datatable, что явно замедляло работу. - person netaholic; 21.06.2017

У меня только что было это сообщение об ошибке при массовом копировании некоторых данных. Хотя, возможно, это была не та же проблема, что и у вас, я получал ту же ошибку.

В частности, я делал следующее: SELECT NULL AS ColumnName...

И пунктом назначения был varchar(3), допускающий значение NULL.

В этом случае все, что мне нужно было сделать, это обновить оператор select следующим образом: SELECT CONVERT(VARCHAR(3),NULL) AS ColumnName...

Это сработало отлично, и сообщение об ошибке исчезло!

person Brett    schedule 20.01.2012

Это правильно, когда мы используем 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();

Код выдавал мне ошибку: идентификатор локали «0» исходного столбца «RollNo» и идентификатор локали «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();

Этот код работает успешно.

person Deepak Dwivedi    schedule 24.11.2011

Ответ от Сал

Если вы копируете неполный набор полей из одной таблицы в другую, независимо от того, находится ли эта таблица в другом домене по всему миру или находится в той же базе данных, вам просто нужно выбрать их по порядку. SqlBulkCopyColumnMappings не работают.

по моей работе абсолютно верно! Спасибо за публикацию. Все должно быть одинаковым — типы данных и т. д. Каждый раз, когда он находит несоответствие, он выдает загадочную ошибку Locale Id — забавную, но разочаровывающую, как h###.

person Tom Townsend    schedule 19.01.2010

Я получал ту же ошибку, и оказалось, что я копировал из столбца VARCHAR в DataTable в INT.

После того, как я изменил тип данных, он работал безупречно. Я успешно скопировал подмножество полей, указав правильные сопоставления полей (сопоставления работали как по имени поля, так и по порядковому номеру).

Поэтому убедитесь, что ваши типы данных верны.

person Vadim    schedule 13.06.2018

Я бы проверил, какие у вас настройки локали по умолчанию. Кроме того, вам нужно будет проверить языковой стандарт обеих таблиц, используя sp_help, чтобы убедиться, что они одинаковы. Если это не так, вам нужно преобразовать его в правильную локаль.

person hova    schedule 19.09.2008

Когда вы меняете сортировку базы данных, столбцы таблицы сохраняют старую сортировку, поэтому вам нужно удалить таблицы и создать их снова.

person Marcus Granström    schedule 25.08.2011

Отличный способ отладить это - взять SQL-запрос, используемый в вашем SqlBulkCopy, и запустить его в студии управления в качестве выбора, например, изменить select * from [table_name] на select * into newTable from [table_name], а затем посмотреть на допустимость значений NULL и типы данных "newTable" по сравнению с 'имя_таблицы'. Если есть какие-либо различия, вы, вероятно, столкнетесь с этой вводящей в заблуждение ошибкой. Настройте запрос или целевую таблицу, пока они не совпадут, и тогда ваша команда будет работать.

person TheRealZing    schedule 11.12.2018

Большое спасибо Дипаку Двиведи за помощь. Вот еще немного хака с 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();
person user2046901    schedule 10.01.2020