Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) использование временных таблиц в 1cpp (число прочтений - 12484 )
trionix
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 12. Июня 2008
использование временных таблиц в 1cpp
27. Декабря 2012 :: 13:26
Печать  
Всем привет.
Вопрос такой: возможно ли мне поместить результат запроса во временную таблицу и использовать эту временную таблицу как источника данных в последующих запросах?

К примеру, есть у меня такой запрос:
Код
Выбрать все
ТекстЗапроса = "
		|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
		|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток Остаток
		|FROM $РегистрОстатки.ОстаткиТоваров(:ДатаРасчетов~,,
		|		(Фирма = :Фирма)
		|		AND (Товар IN (SELECT val FROM #СписокТоваров))
		|		AND (Склад IN (SELECT val FROM #СписокСкладов)),
		|		Товар,) AS ОстаткиТоваровОстатки
		|";
 


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

Я знаю, что есть метод УложитьСписокОбъектов, но он будет работать для списка, а у меня результат запроса суть таблица значений.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #1 - 27. Декабря 2012 :: 14:03
Печать  
Чтобы создать таблицу смотри CREATE TABLE
Чтобы вставить в таблицу смотри INSERT INTO ... SELECT ...
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
trionix
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 12. Июня 2008
Re: использование временных таблиц в 1cpp
Ответ #2 - 27. Декабря 2012 :: 14:12
Печать  
vandalsvq писал(а) 27. Декабря 2012 :: 14:03:
Чтобы создать таблицу смотри CREATE TABLE
Чтобы вставить в таблицу смотри INSERT INTO ... SELECT ...


Встречный вопрос: при создании временной таблицы через Create table мне нужно типизировать мои поля. Вопрос: какой тип использовать (к примеру, для запроса выше для Номенклатуры)?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #3 - 27. Декабря 2012 :: 14:20
Печать  
При создании таблицы типизация полей обязательна. Типизировать нужно исходя из внутренних значений полей 1С.
Справочник = char(13)
Справочник.Вид = char(9) и т.д.

Если будешь использовать класс прямой запрос, там есть специальный метод который умеет создавать таблицы на основании запроса вида
Код
Выбрать все
create table vt1(t1 $Справочник.Номенклатура, t2 $Число.10.2) 


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

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
trionix
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 12. Июня 2008
Re: использование временных таблиц в 1cpp
Ответ #4 - 27. Декабря 2012 :: 14:27
Печать  
vandalsvq писал(а) 27. Декабря 2012 :: 14:20:
При создании таблицы типизация полей обязательна. Типизировать нужно исходя из внутренних значений полей 1С.
Справочник = char(13)
Справочник.Вид = char(9) и т.д.

Если будешь использовать класс прямой запрос, там есть специальный метод который умеет создавать таблицы на основании запроса вида
Код
Выбрать все
create table vt1(t1 $Справочник.Номенклатура, t2 $Число.10.2) 


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


Спасибо! Пошел тестировать.
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #5 - 14. Января 2013 :: 05:22
Печать  
vandalsvq писал(а) 27. Декабря 2012 :: 14:03:
Чтобы создать таблицу смотри CREATE TABLE
Чтобы вставить в таблицу смотри INSERT INTO ... SELECT ...

а если просто
Код
Выбрать все
ТекстЗапроса = "
		|SELECT ОстаткиТоваровОстатки.Товар Товар
		|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток Остаток
		|into #vt
		|FROM $РегистрОстатки.ОстаткиТоваров(:ДатаРасчетов~,,
		|		(Фирма = :Фирма)
		|		AND (Товар IN (SELECT val FROM #СписокТоваров))
		|		AND (Склад IN (SELECT val FROM #СписокСкладов)),
		|		Товар,) AS ОстаткиТоваровОстатки
		|"; 


?
p.s. CREATE TABLE и INSERT INTO использую только при ВыполнитьSQL_изТЗ()
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: использование временных таблиц в 1cpp
Ответ #6 - 15. Января 2013 :: 08:46
Печать  
vandalsvq писал(а) 27. Декабря 2012 :: 14:03:
Чтобы создать таблицу смотри CREATE TABLE
Чтобы вставить в таблицу смотри INSERT INTO ... SELECT ...


Можно ж сделать выборку сразу в новую таблицу:
SELECT
...
INTO ...
FROM

если таблица верменная и суть - источник данных для следующего запроса в пакете, то ИМХО удобнее делать селект-инто
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #7 - 16. Января 2013 :: 07:59
Печать  
Satans Claws писал(а) 15. Января 2013 :: 08:46:
vandalsvq писал(а) 27. Декабря 2012 :: 14:03:
Чтобы создать таблицу смотри CREATE TABLE
Чтобы вставить в таблицу смотри INSERT INTO ... SELECT ...


Можно ж сделать выборку сразу в новую таблицу:
SELECT
...
INTO ...
FROM

если таблица верменная и суть - источник данных для следующего запроса в пакете, то ИМХО удобнее делать селект-инто

+100
  
Наверх
ICQ  
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #8 - 17. Января 2013 :: 12:28
Печать  
мои посты невидимы О_о
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #9 - 25. Января 2013 :: 09:50
Печать  
В свое время у меня в голове синтаксис SQLite так сильно перемешался с SQL, что все конструкции "неуниверсального" характера я просто отмел для себя Улыбка. Вот и получается что по привычке пишу то, как "осталось в памяти".
А еще можно
Код
Выбрать все
CREATE TABLE t AS
(SELECT....) 


И кстати это будет универсально и в SQLite и в SQL (в лайте конструкция select...into не поддерживается).

Пы.сы. ошибся.  Смущённый
« Последняя редакция: 26. Января 2013 :: 15:05 - vandalsvq »  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: использование временных таблиц в 1cpp
Ответ #10 - 25. Января 2013 :: 12:42
Печать  
Чет неканает:
Код
Выбрать все
create table t1 as
(select
*
from Пакеты)
 


Кажеть Неправильный синтаксис около ключевого слова "as".
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #11 - 26. Января 2013 :: 15:07
Печать  
varelchik, да... я не прав. В SQL так не работает... ну по крайней мере согласно msdn. В общем пойду подумаю над своим поведением Улыбка... в следующий раз проверю прежде чем писать.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: использование временных таблиц в 1cpp
Ответ #12 - 29. Января 2013 :: 05:57
Печать  
Ещё можно использовать вариант (когда нет возможности делать временные таблицы (ну мало ли)) с использование CTE
Это на самом деле достаточно весело, можно все засунуть в один текст запроса, разделив его на блоки и будет достаточно наглядно
Код
Выбрать все
        RS = СоздатьОбъект("ODBCRecordset");
	ТекстЗапроса = "
	|WITH CTE AS
	|(
	|SELECT
        |count(*) as strok
	|FROM
	| _1SJourn (NOLOCK)
	|)
	|SELECT
	|*
	|FROM CTE
	|
	|";
	ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ.ВыбратьСтроку();
 

  
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #13 - 29. Января 2013 :: 07:42
Печать  
Satans Claws писал(а) 15. Января 2013 :: 08:46:
vandalsvq писал(а) 27. Декабря 2012 :: 14:03:
Чтобы создать таблицу смотри CREATE TABLE
Чтобы вставить в таблицу смотри INSERT INTO ... SELECT ...


Можно ж сделать выборку сразу в новую таблицу:
SELECT
...
INTO ...
FROM

если таблица верменная и суть - источник данных для следующего запроса в пакете, то ИМХО удобнее делать селект-инто


Во всех тупых учебниках, для тупых программистов, написано, что при создании временных таблиц метод SELECT... INTO... использовать не рекомендуется, т.к. на время создания временной таблицы блокируется база TEMPDB и соответственно в зависимости от размеров временной таблицы время блокировки будет увеличиваться. Один знакомый программер таким образом SQL server умудрялся завалить.
Поэтому в этой констукции "коли лень описывать определение таблицы" лучше использовать два таких запроса в первом SELECT должен возвращать пустую таблицу, но тем не менее определяет структуру, а вторым заполняет.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #14 - 29. Января 2013 :: 09:10
Печать  
На это можно было бы процитировать BOL: Цитата:
В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются.  При минимальном ведении журнала использование инструкции SELECT… INTO может оказаться более эффективным, чем создание таблицы и заполнение ее инструкцией INSERT.

Но, честно говоря, я никогда тщательно не исследовал этот вопрос.  Нерешительный
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #15 - 29. Января 2013 :: 16:16
Печать  
berezdetsky писал(а) 29. Января 2013 :: 09:10:
На это можно было бы процитировать BOL: Цитата:
В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются.  При минимальном ведении журнала использование инструкции SELECT… INTO может оказаться более эффективным, чем создание таблицы и заполнение ее инструкцией INSERT.

Но, честно говоря, я никогда тщательно не исследовал этот вопрос.  Нерешительный

BOL - это хорошо, только наверное это по SQL  2005, хотя я читал что от описанной мой проблемы еще в 7 версии вроде бы избавились.
Тем не менее, лично наблюдал падение сервера при запуске отчета с использованием подобной инструкции. Может правильней не рисковать?
  
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #16 - 29. Января 2013 :: 16:21
Печать  
и к стати, очень рекомендуется не забывать удалять временные таблицы после их использования
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #17 - 31. Января 2013 :: 08:32
Печать  
Nice писал(а) 29. Января 2013 :: 07:42:
Во всех тупых учебниках, для тупых программистов, написано, что при создании временных таблиц метод SELECT... INTO... использовать не рекомендуется, т.к. на время создания временной таблицы блокируется база TEMPDB и соответственно в зависимости от размеров временной таблицы время блокировки будет увеличиваться.

Посмотрел одним глазом. Шаред блокировка базы вряд ли будет кому-то мешать в продакшене, а блокировка схемы, пока речь идёт о локальных временных таблицах, вообще никому не мешает.
Конечно, если бы речь шла о создании обычных или глобальных временных таблицах, было бы немного интереснее, но я не представляю, как можно "сервер завалить" таким способом.
Допускаю, впрочем, что я чего-то не заметил и готов изменить своё мнение, взглянув на соответствующий тестовый стенд.


Nice писал(а) 29. Января 2013 :: 16:21:
и к стати, очень рекомендуется не забывать удалять временные таблицы после их использования

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

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #18 - 31. Января 2013 :: 16:45
Печать  
Nice писал(а) 29. Январь 2013 :: 19:21:
и к стати, очень рекомендуется не забывать удалять временные таблицы после их использования

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

Вот это вы зря написали!
Приведу пример:
У меня, допустим, более 50 пользователей.
И все они, каждый божий день, просто стремятся запустить максимально возможное количество отчетов.
И блин чуть не в каждом используются временные таблицы.
И еще у меня 5 программистов.
И они, очень часто, используя одни и те же наборы данных, как то не могут договорится чтобы использовать одни и те же временные таблицы.
Мало того они даже в своих собственных отчетах, обзывают гады, их все время по разному.
Внимание вопрос:
Какое пространство я должен выделить для базы TEMPDB
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #19 - 31. Января 2013 :: 17:17
Печать  
Ну так если договориться не получается и временные таблицы во всех 100500 отчетах называются по-разному, то тогда наверно надо удалять. Но интересно как тогда удается договориться с этими "гадами" что бы они подчищали за собой?

Я так всегда в отчетах нумерую #tmp1, #tmp2, #tmp3...  и не парюсь с удалением
  

1&&2&&3
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #20 - 31. Января 2013 :: 17:19
Печать  
Ну удалять то за собой дерьмо научить проще по моему
  
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #21 - 31. Января 2013 :: 17:20
Печать  
особенно если не давать советов которые на самом деле не очень корректны
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #22 - 31. Января 2013 :: 17:21
Печать  
Nice писал(а) 31. Января 2013 :: 17:19:
Ну удалять то за собой дерьмо научить проще по моему

это предположение или практика?
  

1&&2&&3
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #23 - 31. Января 2013 :: 17:24
Печать  
trad писал(а) 31. Января 2013 :: 17:21:
Nice писал(а) 31. Января 2013 :: 17:19:
Ну удалять то за собой дерьмо научить проще по моему

это предположение или практика?

Практика.... Если человек понимает что такое дерьмо ему как то стыдно его после себя оставлят
  
Наверх
 
IP записан
 
Nice
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Зарегистрирован: 09. Июля 2007
Re: использование временных таблиц в 1cpp
Ответ #24 - 31. Января 2013 :: 17:28
Печать  
Я так всегда в отчетах нумерую #tmp1, #tmp2, #tmp3...  и не парюсь с удалением

это ведь тоже не совсем правильно... а когда их много поди разберись какой это #tmp
нас ведь наверное не зря учили давать значащие иимена
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #25 - 31. Января 2013 :: 17:44
Печать  
Nice писал(а) 31. Января 2013 :: 17:28:
[quote]это ведь тоже не совсем правильно... а когда их много поди разберись какой это #tmp
да, нормально вроде - не путаюсь

Цитата:
нас ведь наверное не зря учили давать значащие иимена
я проще смотрю на вещи: где удобнее именовать сущности - именую, а где удобнее нумеровать - нумерую Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: использование временных таблиц в 1cpp
Ответ #26 - 01. Февраля 2013 :: 02:56
Печать  
А мы временные таблицы вообще GUID'ами называем. Гарантировано не пересекутся. Хотя в большинстве случаев они конечно удаляются, ибо создаются и удаляются генератором текстов запросов.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: использование временных таблиц в 1cpp
Ответ #27 - 01. Февраля 2013 :: 09:36
Печать  
berezdetsky писал(а) 31. Января 2013 :: 08:32:
Nice писал(а) 29. Января 2013 :: 16:21:
и к стати, очень рекомендуется не забывать удалять временные таблицы после их использования

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


Какой-нить робот, который постоянно генерит какие-нить отчеты, и который рестартится в лучшем случае раз в неделю, легко может иметь генерить тысячами временных таблиц. И я бы предпоччел их удалять, чем ждать когда они сами сдохнут с закрытием SPID.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать