v7: insert into, values, select, подзапрос #759858


#0 by Eeakie
Всем доброй ночи. Есть запрос, который даёт определенное количество строк с пятью значениями в каждой. Надо создать новый элемент справочника и эти пять значений занести в элемент. Как это сделать? В двух словах..
#1 by Eeakie
Видимо, придётся ждать до завтра.
#2 by lxndr
#3 by Ёпрст
найти максимальный id справочника и прибавлять 1-ку в inserte
#4 by фобка
В элементе справочника ТЧ нет, поэтому только в строке хранить внутреннее представление
#5 by Тихий омут
+ ток помни, что ид - он то ведь 36ричный. и кстати, уриб есть? справочник мигрирует?
#6 by Eeakie
УРИБ нет. Перевод 36to10 где-то видел. Вопрос больше к синтаксису. Представим, что у нас есть выборка: Предположим, что в результате в выборке 10 строк. Вот как конкретно их засунуть в другой справочник, где есть только id, descr, Количество и Цена? Пример никто дать не может?
#7 by НЕА123
+ иерархический? тип, длина кода? и т.д. ЗЫ "В двух словах.."
#8 by НЕА123
эээ... тогда может и сторно. но я бы все-рвно по-честному добавлял...
#9 by Eeakie
Думал проще будет :) Иерархии нет, код (число, 8), наименование (текст, 1).
#10 by Eeakie
+ Количество (число, 10, 3), Цена (число, 17, 2)
#11 by Eeakie
Я может как-то непонятно спросил. |insert into $Справочник.Справочник1 (Количество, Цена) |values (10, 20.5) Как в вэльюс подставить свои значения из запроса? Конечно, можно сделать из запроса ТЗ и перебором построчно выполнять этот текст, но в выборке 450к+ строк. Это, похоже, будет надолго.
#12 by ADirks
from    ...
#13 by Eeakie
Неправильный синтаксис возле from ©
#14 by Eeakie
|insert into $Справочник.Справочник1 (Количество, Цена) Прямо вот так?
#15 by Это_mike
дык values потерял...
#16 by Eeakie
#17 by Это_mike
Не, похоже я загнался... посмотри в BOL, там примеры есть insert into $Справочник.Справочник1 ($Справочник.Справочник1.Количество, $Справочник.Справочник1.Цена)    from       ...
#18 by ADirks
в правильно ну, с точки зрения синтаксиса, конечно
#19 by Eeakie
, , Спасибо. Хоть какие-то другие ошибки стали вылазить :)
#20 by Это_mike
"никогда не ищи ошибки, если не знаешь, что с ними делать дальше..."©
#21 by Eeakie
Я извиняюсь, а с какой точки зрения там неправильно?
#22 by ADirks
ну ты же ошибки видишь, которые "стали вылазить"
#23 by Eeakie
Вижу и теперь еще больше вопросов..
#24 by Это_mike
см :-)))
#25 by Eeakie
+ Ругается, что я хочу в поле numeric(18, 3) хочу вставить NULL, а поле NOT NULL. Фигня в том, что Количество из подзапроса не может быть NULL. 0 - еще куда ни шло, но точно не NULL.
#26 by Eeakie
Тут одни Ванги собрались :)
#27 by Eeakie
Невозможно вставить повторяющуюся ключевую строку в объект "dbo.SC8548" с уникальным индексом "IDD" Как побороть?
#28 by Это_mike
вставлять уникальную, вестимо. у тебя у реквизита - контроль уникальности
#29 by trad
наверно, все же лучше пойти по пути: Спр.Записать
#30 by Eeakie
Я контроль уникальности вообще убрал из справочника.
#31 by Eeakie
Нееет. Надо уже доразбираться.
#32 by Это_mike
"нас невозможно сбить с пути - нам пофигу, куда идти"©?
#33 by Это_mike
ну так индекс ИДД по чему уникален? по иду? значит, вставляешь с тем же идом...
#34 by Eeakie
Так а где выставляется id + 1? В инсерте или в селекте? (select max(dbo.Convert36to10(Спр.id)) + 1 from $Справочник.СтрокиЗаявок as Спр with (nolock)) as id
#35 by trad
вот ты так пишешь. а прикидывал что будет если такой insert+select запустят одновременно 2+ пользователя?
#36 by Это_mike
жуть какая... wms лепишь, чтоль?
#37 by Это_mike
"ты вот сейчас матом ругаешься, а потом будешь этими же руками хлеб брать!"© :-))
#38 by Eeakie
Одновременно запускаться не будет. Лучше не спрашивай :) , , может лучше что-то толковое скажете?
#39 by Это_mike
сделай хранимку, которая будет новый ид возвращать... и ее используй
#40 by Это_mike
баян, в общем...
#41 by Это_mike
вообще, даже я ( :-)) о как я сказанул!) не люблю создавать  элементы и документы напрямую....
#42 by Eeakie
Бляха, я вот совсем не в курсе про эту "хранимку". Что за оно? А может действительно нафиг эти прямые записи в таблицы? Просто очень уж долго штатно заполняет полмиллиона записей.. и примерно раз в неделю их еще и обновлять надо..
#43 by НЕА123
в транзакции ?
#44 by Это_mike
чойто типпо CREATE FUNCTION NewId Returns char Begin @ret = select ltrim(dbo.convert10to36(max(dbo.convert36to10(left (id,6)))+1)+'   ') from $Справочник.xxxxx End
#45 by Eeakie
И в транзакции не очень-то быстро. Хм.. попробую.
#46 by trad
еще какая то хранимка - лишнее тут
#47 by trad
в этом запросе (select max(dbo.Convert36to10(Спр.id)) + 1 from $Справочник.СтрокиЗаявок as Спр with (nolock)) as id во-первых надо блокировать: вместо (nolock) нужно (updlock) при этом если insert/select не в одном выражение, то нужно обернуть транзакцией во-вторых нужно помнить об индексах и накладывать блокировку на диапазон ключа индекса, а не на всю таблицу поэтому нужно писать так: dbo.Convert36to10(max(Спр.id)) сравни планы выполнения двух запросов select max(dbo.Convert36to10(Спр.id)) + 1 from $Справочник.СтрокиЗаявок as Спр with (nolock) select dbo.Convert36to10(max(Спр.id)) + 1 from $Справочник.СтрокиЗаявок as Спр with (nolock) думаю поймешь о чем я
#48 by Это_mike
можно и в подзапрос. но лень....
#49 by trad
для быстрой вставки поищи примеры использования SQLLock из 1cpp.dll - он спецом для этого был придуман
#50 by НЕА123
> И в транзакции не очень-то быстро. сколько в 1 транзакции элементов?
#51 by trad
а вообще самый скоростной и экстремальный способ вставки - bulk insert
#52 by Это_mike
да и без плана понятно, что лажанулся...
#53 by ADirks
Если каждый день надо полмиллиона записей лопатить, то может подумать о том, чтобы свою табличку завести? Заодно правильные индексы можно сделать.
#54 by Eeakie
Спасибо за разъяснение. Похоже, там еще много чего кроме этого надо знать. Изначально стоял вопрос в обычном отчете, который должен был брать ТЧ нескольких документов, брать товар, его цены из периодики, потом конвертить в валюту и считать сроки оплаты (и там еще хренова туча условий на отбор). Первоначальный запрос оказался вполне себе здоровым с и работал не очень быстро (пытался оптимизировать, но безуспешно). После чего было решено замутить отдельный справочник с основными данными по ТЧ, и обрабатывать уже их. И вроде бы всё ничего, но данные в ТЧ могут меняться задним числом, что приводит к неточностям. Поэтому справочник надо перезаполнять периодически. Не за весь период, конечно, но за последний год хотя бы (могут править некоторые моменты в течении года). Так вот за последний год получается ~500k строк в выборке и их надо перезаписать в справочник, а длится это достаточно долго. Пробовал update, но исходя из того, что меняться могут не только цены, но и Товар и Документ, решил, что проще удалить последний год и просто перезаполнить. Вот отсюда вся эта дребедень. Возможно, есть какой-то более простой способ организации этого всего, но я его не нашел.
#55 by trad
для реализации такого хранилища лучше прислушаться к
#56 by Eeakie
Честно говоря, для меня "завести свою табличку" и "сделать правильные индексы" звучит не сильно знакомо : 55
#57 by Eeakie
, , дайте ссыль, если не трудно, где хоть что-то по этой теме будет объяснено. Пока оставлю всё на Новый + Записать, а со временем попробую перевести на "доступный" для скуля язык.
#58 by Это_mike
BOL: create table create index
#59 by Eeakie
technet чтоль?
#60 by Это_mike
Book OnLine, ставится прямо вместе с SQL...
#61 by Eeakie
На технете/мсдн аналог просто. Спасибо.
#62 by trad
пока изучаешь работу со своей таблицей, можешь свой алгоритм с Новый+Записать немного модифицировать под SQLLock Пример тут
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С