четверг, 20 июня 2013 г.

1С 7.7: Ошибка SQL State: 23000 Native: 1505

Возникла тут у клиентов вообщем-то простая задача - сконвертировать базу 1С 7.7 (Торговля и Склад) с DBF на SQL вариант. Провели тестирование и исправление базы, никаких ошибок вообщем-то не было выявлено. Выгрузили данные, но при попытке загрузки их в SQL базу получили сообщение об ошибке:


SQL State: 23000 
Native: 1505 
Message: [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 2. Most significant primary key is ' BF3 '. 

SQL State: 01000 
Native: 3621 
Message: [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has ben terminated.

Быстрое гугление на тему привело к вот этой статье и пониманию того, что в данном случае мы знали в какой таблице был замечен неуникальный индекс, а в нашем случае - нет. Собственно дальнейшие изыскания привели к следующему. Если не закрывать и не сворачивать окно 1С во время загрузки в SQL базу, то при появлении MessageBox'а об ошибке можно увидеть какую информацию он пытался загрузить последней. В нашем случае это был справочник Цены, вернее создание индексов справочника цены. Смотрим в DBF варианте файл 1Cv7.dd и видим, что таблица справочника цен - это SC319.DBF. Открываем ее в DBF Viewer 2000 и видим что поле ID действительно неуникально, присутствуют две записи с ID = BF3. Далее мы воспользовались инструментом Tools -> Delete duplicates ... оставив в качестве фильтра только ID, и удалили дублирующиеся данные:


После чего сделали Edit -> Pack (для физического удаления помеченных на удаление записей), и на всякий случай удалили файл индексов SC319.CDX. После чего по новой выгрузили данные из DBF базы и попытались по новой загрузить их в базу MSSQL. Этап создания индексов таблицы Цены прошел успешно. Ошибка SQL State: 23000 была побеждена.


Ну и несколько ссылок с решением аналогичной проблемы напоследок:
В последней ссылке есть действенное решение по определению места (т.е. на каких именно данных останавливается загрузка) на котором все падает, процитирую:

1. запустив профайлер SQL загружаем базу. с логе профайлера будет инфа на какой ошибке все завалилось.
2. отредактировал битые dbf ки с помощью плугина wlx_xbaseview к тотал командеру (удалил дублирующие записи)
3. дублирующие записи нашел: выгрузил dbf в excel и сделал сводную таблицу по ключевым полям. где кол-во было > 1 -- это дубли

1 комментарий:

  1. Спасибо за статью! Она помогла справиться с переносом базы на SQL. Премного благодарен!

    ОтветитьУдалить