Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Как из таблицы значений создать временную таблицу sql

v7: Как из таблицы значений создать временную таблицу sql
Я
   LisaAlisa
 
29.05.19 - 16:03
Добрый день!
Есть таблица значений с колонками
"Подразделение" имеет тип Справочники.Подразделения
"Номер" тип Число.

Можно ли используя прямой запрос создать временную таблицу по данным таблицы значений?
 
 
   Mikeware
 
1 - 29.05.19 - 16:04
можно
   Mikeware
 
2 - 29.05.19 - 16:06
ВыполнитьSQLизТЗ()
   Очевидно
 
3 - 29.05.19 - 17:10
(0)
--Создаем временную таблицу
Create table #tt1 (Column_NUMBER NUMERIC(38,9), Column_REF BINARY(16))

-- Добавляем первую строку из ТЗ
INSERT INTO #tt1 (Column_NUMBER,Column_REF) VALUES(*Номер*,*sql id ссылки*)

-- Добавляем Вторую строку из ТЗ
INSERT INTO #tt1 (Column_NUMBER,Column_REF) VALUES(*Номер*,*sql id ссылки*)

-- и т.д.
   LisaAlisa
 
4 - 29.05.19 - 17:33
ТабЮЛ = СоздатьОбъект("ТаблицаЗначений");
    ТабЮЛ.НоваяКолонка("ЮЛ", "Справочник.Подразделения",,);
    ТабЮЛ.НоваяКолонка("Приоритет", "Число", 10, 0);
    
    Сч = 1;
    Пока Сч <= ДопЮЛ.РазмерСписка() Цикл
        ТабЮЛ.НоваяСтрока();
        ТабЮЛ.ЮЛ = ДопЮЛ.ПолучитьЗначение(Сч);
        ТабЮЛ.Приоритет = Сч;
        Сч = Сч + 1;
    КонецЦикла;

    
    RS.Отладка(1);
    ТекстЗапроса = "
    |IF EXISTS (SELECT *
    |       FROM   tempdb..sysobjects
    |       WHERE  id = object_id('tempdb..##PrioritetUL'))
    |    DROP TABLE ##PrioritetUL
    |";
    rs.Выполнить(ТекстЗапроса);    
    
    Если rs.Подготовить("
    |Insert into ##PrioritetUL (ЮЛ, Приоритет) VALUES (?,?)")=0 тогда
    Предупреждение(rs.ПолучитьОписаниеОшибки());
        возврат ;
    КонецЕсли;

    rs.ВыполнитьSQL_ИзТЗ(ТабЮЛ);

Ошибка:
rs.ВыполнитьSQL_ИзТЗ(ТабЮЛ);
{E:\...}: Произошла ошибка при формировании автоматических параметров.                
Необходимо выполнить подготовку запроса или проверить синтаксис!
State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '##PrioritetUL'.
   palpetrovich
 
5 - 29.05.19 - 17:41
(4) Create  потеряла
вот рабочий код:

Процедура ВТ_ИЗ_ТЗ()
    
    _тз = СоздатьОбъект("ТаблицаЗначений");
    _тз.НоваяКолонка("Дата", "Дата");
    _тз.НоваяКолонка("Строка","Строка", 3);
    _тз.НоваяСтрока();_тз.Дата = ТекущаяДата();_тз.Строка = "Раз";
    _тз.НоваяСтрока();_тз.Дата = ТекущаяДата()+1;_тз.Строка = "Два";
    рс = СоздатьОбъект("ODBCRecordSet");
    рс.ВыполнитьИнструкцию("IF OBJECT_ID(N'tempdb..#ВТ_ИЗ_ТЗ', N'U') IS NOT NULL DROP TABLE #ВТ_ИЗ_ТЗ"); 

    рс.Выполнить("Create table #ВТ_ИЗ_ТЗ (Дата DateTime, Строка varchar(3))");

    рс.Подготовить("Insert Into #ВТ_ИЗ_ТЗ (Дата, Строка) Values (?,?)");

    рс.ВыполнитьSQL_ИзТЗ(_тз);
    тзРез = рс.ВыполнитьИнструкцию("select * from #ВТ_ИЗ_ТЗ ").ВыбратьСтроку();

    рс.ВыполнитьИнструкцию("IF OBJECT_ID(N'tempdb..#ВТ_ИЗ_ТЗ', N'U') IS NOT NULL DROP TABLE #ВТ_ИЗ_ТЗ"); 

    
КонецПроцедуры
   LisaAlisa
 
6 - 29.05.19 - 18:01
(5) какой тип поля описать в ВТ, если в ТЗ поле имеет тип Справочник.Подразделение?
   Botanik8888
 
7 - 29.05.19 - 18:08
(6) По длине идентификатора, если не запамятовал то 13 символов для id справочника
   Botanik8888
 
8 - 29.05.19 - 18:09
+(7) извините, ошибся. 9 Символов.
ЗЗЫ: http://www.metaprog.co.ua/secrprog/const_spr.html
   Z1
 
9 - 29.05.19 - 19:15
(6) char(9)
(4) Если временная таблица с ## эта таблица для всех пользователей sql
удаляя такую таблицу можешь удалить данные другого пользователя которые
в этот момент используются другим процессом.
Это надо учитывать
Второе в эту таблицу можети другой процесс записать и снова труднообнаруживаемая ошибка
Для таких таблиц лучше иметь внутри колонку  spid и по ней записывать читать , удалять данные.
А саму таблицу в нужном месте просто создавайте ( create )
Т.е. если таблица есть она не создастся если нет то создастся.


# это врменная таблица текущего процесса.
   LisaAlisa
 
10 - 30.05.19 - 10:21
Изменила код

    RS.ВыполнитьИнструкцию("IF OBJECT_ID(N'tempdb..#PrioritetUL', N'U') IS NOT NULL DROP TABLE #PrioritetUL");
    
    rs.Выполнить("Create table #PrioritetUL (ЮЛ CHAR(9), Приоритет SMALLINT (2))");

    
    Если rs.Подготовить("
    |Insert into #PrioritetUL (ЮЛ, Приоритет) VALUES (?,?)")=0 тогда
    Предупреждение(rs.ПолучитьОписаниеОшибки());
        возврат ;
    КонецЕсли;
    
    rs.ВыполнитьSQL_ИзТЗ(ТабЮЛ);

Ошибка та же:
{E:\///}: Произошла ошибка при формировании автоматических параметров.                
Необходимо выполнить подготовку запроса или проверить синтаксис!
State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '#PrioritetUL'.
   trad
 
11 - 30.05.19 - 10:53
   Sserj
 
12 - 30.05.19 - 11:05
За сутки можно уже было просто в ручную набросать :)

метаДата = СоздатьОбъект("MetaDataWork");
текстЗапроса = "
|Insert into #PrioritetUL (ЮЛ, Приоритет)
| VALUES ";

текстЗначений = "";
ТабЮЛ.ВыбратьСтроки();
Пока ТабЮЛ.ПолучитьСтроку() = 1 Цикл
  текстЗначений = текстЗначений + "," + РазделительСтрок +
 "('" + метаДата.ЗначениеВСтрокуБД(ТабЮл.Юл) + "'," + СокрЛП(ТабЮл.Приоритет) + ")";
КонецЦикла;
//Убираем первую запятую

текстЗначений = Сред(текстЗначений, 2);
текстЗапроса = текстЗапроса + текстЗначений;

rs.Выполнить(текстЗапроса);
   LisaAlisa
 
13 - 30.05.19 - 11:26
(11) (12)
Спасибо, эти способы я тоже попробую, но хочется понять, что в моем коде не так
   Z1
 
14 - 30.05.19 - 11:50
(13) Пиши проще
Попытка
rs.Выполнить("Create table #PrioritetUL (ЮЛ CHAR(9), Приоритет SMALLINT )");// (2) это лишнее

Исключение
Коецпопытки;

создалась или нет таблица можно проверить обрамив исключением
Тз1 = rs.Выполнить("select top 1 *from #PrioritetUL ");


Мое мнение не надо  колонки называть русскими символами,
и конструкция tempdb..#PrioritetUL мне непончтна не факт что это эквивалентно имени #PrioritetUL
   LisaAlisa
 
15 - 30.05.19 - 12:30
(14) Переименовала колонки в латиницу, таблица создалась. Спасибо!
   LisaAlisa
 
16 - 30.05.19 - 12:31
(11) Посмотрела Ваш код
    Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
        ка);  //ЗДЕСЬ ЧТО ДОЛЖНО БЫТЬ?

        Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
            Продолжить;
        КонецЕсли;
   trad
 
17 - 30.05.19 - 12:41
(16)
    Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
        Идентификатор=ТЗ.ПолучитьПараметрыКолонки(Тек,Тип,Длина,Точность,,,ФорматнаяСтрока);
        Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
            Продолжить;
        КонецЕсли;
   LisaAlisa
 
18 - 30.05.19 - 13:36
Спасибо всем за помощь!!

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.