Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / [игнор отключен] [закрыт для гостей] / Перенос данных посредством SQL / 16 сообщений из 16, страница 1 из 1
15.11.2011, 07:18
    #37526622
Перенос данных посредством SQL
При записи в таблицу выдается сообщение:

Cannot insert duplicate key row in object 'SC41' with unique index 'IDD'.

Понятно, что дело в уникальности значений индексов, и система не дает создать новую запись в таблице со значением индекса, которое уже есть. Вопрос следующий: как обходить это ограничение? Имеется в виду, что обходить автоматически, а не лезть в QA каждый раз, когда такое сообщение выплевывается, с последующим поиском соответствующих строк, которые не записались.
...
Рейтинг: 0 / 0
15.11.2011, 08:21
    #37526638
Перенос данных посредством SQL
Никто не знает?
...
Рейтинг: 0 / 0
15.11.2011, 09:33
    #37526684
DmitriyZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
Злобный ЙожегНикто не знает? а вы форумом не ошиблись?
...
Рейтинг: 0 / 0
15.11.2011, 10:08
    #37526740
The Dim!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
ну тут два варианта:

1. саморучно завалить базу, чего уж там....
2. произвести тестирование и исправление.
...
Рейтинг: 0 / 0
15.11.2011, 10:18
    #37526762
Panshin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
судя по имени таблицы это 1с77. просто снесите индекс drop index sc41 ... Думаю, 1с77 сама все перестроит. Если не перестроит, то надо смотреть какие поля задействованы в построении индекса, и понять откуда берется одинаковость индекса в записи. Может быть поле code формируется не так или достигло своего последнего значения.
...
Рейтинг: 0 / 0
15.11.2011, 10:31
    #37526789
Перенос данных посредством SQL
Panshin,

Да, это 7.7. Проблему временно удалось решить, установив соединение в запросе, который добавляет записи, таблицы записей из источника с таблицей справочника базы-приемника по ID с условием, что запись в справочнике-приемнике IS NULL. Я так понял, он туда лезет записывать всякий раз, когда обрабатывает справочник, имеющий в своих реквизитах ссылку на тот, на котором выскакивала такая ошибка.

Теперь вопрос в следующем: данные у меня переносятся, как вы наверно догадались, из одной базы в другую, идентичную. В процессе переноса встречаются строки неограниченной длины, у которых тип прописан как MEMO. Данные базы-источника я собираю в ТЗ, которую потом сливаю в ВТ, и уже из этой ВТ заполняю таблицу справочника базы-приемника. При заполнении таких полей он мне выдает ошибку: "Усечение данных строки справа". Как с этим справиться?
...
Рейтинг: 0 / 0
15.11.2011, 10:31
    #37526790
sWinTyz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
точно сносите индекс
и кластерный и обычный
ломай ее ... ломай заразу

бэк ап есть?
...
Рейтинг: 0 / 0
15.11.2011, 10:39
    #37526807
Перенос данных посредством SQL
sWinTyzточно сносите индекс
и кластерный и обычный
ломай ее ... ломай заразу

бэк ап есть?

Естессно. База вообще тестовая. Но, повторюсь, сейчас не это главная проблема.
...
Рейтинг: 0 / 0
15.11.2011, 10:52
    #37526831
Panshin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
Злобный Йожег,
Если пользуетесь штатным импортом / экспортом то никак. Используйте bcp.
...
Рейтинг: 0 / 0
15.11.2011, 11:09
    #37526860
Volochkova
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
Найдите дубли, вполне возможно что проблема с DBF файлом.
В отдельную баз просто затащите данные, безо всяких индексов и ключей.
Запросом - типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Select
         A2.*, s.*
From
     SC41 s 
inner join 

        (Select 
             ID, Count(*) As A1
         From 
                SC41  
         Group by 
                ID
        Having 
                Count(*) > 1 
) 
As A2 on s.ID = a2.ID

Найдете как раз все дубли.
...
Рейтинг: 0 / 0
15.11.2011, 14:00
    #37527266
Перенос данных посредством SQL
Кто скажет, почему не выполняется запрос вида "INSERT INTO SC84(SP95, SP101) VALUES ('1', '1')"?

SP95, SP101 - поля типа "строка неогр. длины".
...
Рейтинг: 0 / 0
15.11.2011, 14:38
    #37527371
tvm
tvm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных посредством SQL
имхо, поля типа "строка неогр. длины" в отдельной таблице хранятся. в дбф это 1SBLOB в скуле нет возможности посмотреть
...
Рейтинг: 0 / 0
15.11.2011, 16:51
    #37527646
Перенос данных посредством SQL
Я так понимаю, что ошибка выскакивает на MS SQL Server. Скорее всего поле IDD на таблице SC41 имеет тип Identity, т.е. автоинкремент. Это ограничение можно обойти, если перед sql запросом сначала выполнить
Код: plaintext
set identity_insert SC41 ON
и в конце нужно выключить эту опцию командой
Код: plaintext
set identity_insert SC41 OFF

В скрипте вставки записей, например, можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET IDENTITY_INSERT SC41 ON
GO

Insert into SC41(...)
VALUES (...)
GO

SET IDENTITY_INSERT SC41 OFF
GO

Эта опция отключает запрет на вставку значений в поле с типом identity
...
Рейтинг: 0 / 0
15.11.2011, 17:51
    #37527803
Перенос данных посредством SQL
Demigod the SatanEye,

Спасибо, будем иметь в виду.

Всё же, подчеркиваю, более живым является сейчас вопрос о записи данных в реквизиты типа строка неограниченной длины. В 7.7 в файловой версии они действительно лежат в таблице 1SBLOB, в скулевой, как я понял - непосредственно в таблицах справочников. Если нельзя запросом туда внести значение, то как иначе можно это сделать? Дело здесь осложняется еще тем, что данные переносятся между двумя базами. Подключаться к базе-приемнику по ОЛЕ для перезаписи элементов справочников с заполнением таких полей - не вариант, ибо слишком неудобно.
...
Рейтинг: 0 / 0
15.11.2011, 18:01
    #37527829
Перенос данных посредством SQL
tvm,

В скуле они хранятся вместе с другими полями в таблице справочника. При обычном просмотре таблицы значения этих полей не увидишь, а вот запросом все прекрасно читается. Но раз читается, значит, как-то и записывается?! Вопрос: как именно?
...
Рейтинг: 0 / 0
18.11.2011, 09:23
    #37532773
Перенос данных посредством SQL
в SQL Server скорее всего используется тип TEXT, nTEXT или image. Для записи в такие поля используются функции WRITETEXT и SETTEXT. Подробнее можно почитать в MSDN тут

Пример, как можно писать в поле типа очень длинная строка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DECLARE @ptrval binary( 16 ); -- Объявляем переменную-указатель на строку неогр. длины

SELECT @ptrval = TEXTPTR(SP95) 
FROM SC41 S
WHERE S.IDD =  16  -- выбираем данные в указатель из поля неогр. длины из нашей таблицы где IDD = 16 (например)

WRITETEXT SC41.SP95 @ptrval 'Новая очень-очень длинная строка данных';
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Перенос данных посредством SQL / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]