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

Можно ли используя прямой запрос создать временную таблицу по данным таблицы значений?
1 Mikeware
 
29.05.19
16:04
можно
2 Mikeware
 
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 ссылки*)

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


# это врменная таблица текущего процесса.
10 LisaAlisa
 
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'.
11 trad
 
30.05.19
10:53
12 Sserj
 
30.05.19
11:05
За сутки можно уже было просто в ручную набросать :)

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

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

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

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


Мое мнение не надо  колонки называть русскими символами,
и конструкция tempdb..#PrioritetUL мне непончтна не факт что это эквивалентно имени #PrioritetUL
15 LisaAlisa
 
30.05.19
12:30
(14) Переименовала колонки в латиницу, таблица создалась. Спасибо!
16 LisaAlisa
 
30.05.19
12:31
(11) Посмотрела Ваш код

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