Имя: Пароль:
1C
 
Странное использование конструкции INSERT into ... SELECT
0 beholder
 
16.08.07
18:44
Вот такая кнструкция

Пока Запрос.Группировка(1) = 1 Цикл
Пока Запрос.Группировка(2) = 1 Цикл
Пока Запрос.Группировка(3) = 1 Цикл

ТекстЗапроса = "
INSERT into  XXX.dbo.XXX  (TOVAR, DATE)
SELECT '" + Запрос.Товар.Наименование + "' AS Expr1, '" + СтрДата  + " AS Expr2, '";

НД.Выполнить(ТекстЗапроса);    


Я хочу понять, есть какие-то аргументы в пользу такого использования? Или лучше использовать

INSERT into () values ()
1 перцептрон
 
16.08.07
18:47
о_О
2 Андрюха
 
16.08.07
18:48
O_o
3 перцептрон
 
16.08.07
18:53
О о

-|-
/ \
4 перцептрон
 
16.08.07
18:55
блин, испортило
5 beholder
 
16.08.07
19:08
чё не так?
6 beholder
 
16.08.07
19:09
блин. анимешники на
7 insider
 
16.08.07
19:13
(7) это вот у тебя хотелось спросить, че не так с консрукцией? :)
8 beholder
 
16.08.07
19:16
(7) ну INSERT into ... SELECT  используется чтобы сразу вставить несколько строк в табличку из другой таблички и т.п.
Нахрена это использовать в цикле когда заведомо вставляется 1 строка, мне не понятно. Вот я и думаю, то ли это просто чувак немножко неаккуратно написал код. То ли он гуру и знает что так будет быстрее работать...
9 insider
 
16.08.07
19:19
(8) такая конструкция имеет право на жизнь и используется когда она нужна, а когда не нужна - не используется :)
ну не знаю, как тебе ответить, почитай про скуль, поймешь
10 beholder
 
16.08.07
19:21
(9) ты хочешь сказать что в этой конструкции заключен глубокий смысл.
11 insider
 
16.08.07
19:26
(10) ну я бы юзал, когда мне в некую таблицу надо внести нечто (что - я не знаю, но могу выбрать по определенным условиям из другой таблицы).
я правда не врубаюсь в твой вопрос. еще спроси зачем select вообще нужен :)
12 insider
 
16.08.07
19:28
+11 некорректно: еще если мне нужно вставить несколько строк (это вдруг не понял) по вышеописанным принципам
13 beholder
 
17.08.07
10:09
(12) вот ыменна!
Посмотри внимательней на код. Идет цыкл по выборке запроса (1Сного) и вставляется фактически 1 строка. Обычно INSERT into ... SELECT используется так

INSERT into Table1 (Col1, Col2)
SELECT * FROM table2

Это я понимаю. А вот зачем этот оператор использовать для вставки 1 строки... не врубаюсь. Может так работает быстрее ... Фиг знает
14 DmitrO
 
17.08.07
10:24
да не работает это быстрее, да и медленее тоже не работает
чтобы было реально быстрее надо параметризировать запрос
15 DmitrO
 
17.08.07
10:28
причем, имхо, пофиг какой с select или с values
но идеалогически правильнее в данном случае использовать insert values
16 DmitrO
 
17.08.07
10:31
>>Вот я и думаю, то ли это просто чувак немножко неаккуратно написал код. То ли он гуру и знает что так будет быстрее работать...
Если бы он был гуру, он бы использовал параметризированный запрос, а так как написано, это корявые понты. :)
17 masky
 
17.08.07
10:32
>чтобы было реально быстрее надо параметризировать запрос
с курсором еще быстрее
18 DmitrO
 
17.08.07
10:36
да вот фиг знает, не факт, надо пробовать, любой среверный курсор это много маленьких запросов вызовов служебных ХП, собственно параметризированный запрос это тоже самое
19 DmitrO
 
17.08.07
10:36
*серверный курсор
20 masky
 
17.08.07
10:38
>собственно параметризированный запрос это тоже самое
неа
21 DmitrO
 
17.08.07
10:38
имхо быстрее всех с этой задачей справится 1с++ и метод ВыполнитьСКЛ_ИзТЗ
22 masky
 
17.08.07
10:40
а он случаем не курсор делает?
23 DmitrO
 
17.08.07
10:40
>>неа
объективные причины назвать можешь, или по опыту знаешь?
24 DmitrO
 
17.08.07
10:40
>>а он случаем не курсор делает?
нет, параметризированный запрос
25 DmitrO
 
17.08.07
10:43
там просто существенный выигрышь будет еще в том, что результат запроса (1С-овского) можно быстро выгрузить в ТЗ, и эту ТЗ передать сразу в метод ВыполнитьСКЛ_ИзТЗ, т.о. не будет итераций ТЗ и установки значений в модуле 1С, а будет работать все компиллированное (итерации ТЗ)
26 774816
 
17.08.07
10:48
(0) Переправь на values () а чувак просто не знал что есть
INSET INTO .. VALUES()
27 beholder
 
17.08.07
11:29
(25) - ну это да. Видимо и придется так сделать, ибо неприемлемо медленно работает. Я еще попробую запрос 1Совский на прямой переписать и и зполучившейся ТЗ ...

(26)  - ну не то что не знал, видимо сначала хотел вставлять скопом а потом передумал. А эта конструкция осталась...
28 DmitrO
 
17.08.07
11:45
>>Я еще попробую запрос 1Совский на прямой переписать и и зполучившейся ТЗ ...
И это правильно, одобрям, т.к. результат 1с-кого запроса это dbf-ка на локальном диске в каталоге временных файлов - это туфта при современных объемах памяти.
29 beholder
 
17.08.07
19:11
Антиресно а удалить вот так скопом можно? Вот это вот:

//    НД.Prepare("Delete from XXX.dbo.INFO_REMONT where TOVAR_NAME   = ?
//                |and SERIAL_NUM     = ?");
//
//    НД.ExeSQL_FromTV(тз);

Не работает. Пишет что неправильный формат времени
30 Gepard
 
17.08.07
20:29
(25) +1
31 Gepard
 
17.08.07
20:33
(30) нифига

там From нету, он просто подставляет переменные, т.е. получается просто идиотизм...
32 Gepard
 
17.08.07
20:35
(31) + или в (0) не полный текст?
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.