Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) использование временных таблиц в 1cpp (число прочтений - 12435 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать