Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Ср Дек 14, 2022 15:54 Заголовок сообщения: передача нескольких параметров |
|
|
Как правильно передать 2 параметра в блок T-SQL ?
Такая конструкция выдает ошибку
Код: | execute{
local x = @leave_sched_main_dlg:cur_year['];
local t = _Table[""];
Execute xSql
{$(:x); (:t);
declare @ListData AS [dbo].[LeaveSchedCrossType]
delete from @ListData
insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
select * into @t from user_leave_sched_calend (@ListData, @x) };
};
|
|
|
Вернуться к началу |
|
|
superjek
Зарегистрирован: 04.04.2022 Сообщения: 28
|
Добавлено: Ср Дек 14, 2022 16:27 Заголовок сообщения: |
|
|
Код: | execute{
local x = @leave_sched_main_dlg:cur_year['];
local t = _Table[""];
Execute xSql
{$(:x, :t);
declare @ListData AS [dbo].[LeaveSchedCrossType]
delete from @ListData
insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
select * into @t from user_leave_sched_calend (@ListData, @x) };
}; |
|
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Ср Дек 14, 2022 16:41 Заголовок сообщения: |
|
|
Принцип верный, но теперь интерпретатор считает @t переменной, а не алиасом таблицы. И говорит, что ошибка типов. Не могу мол запихать в одну переменную целую таблицу. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Ср Дек 14, 2022 16:52 Заголовок сообщения: |
|
|
Вообще, изначально делал так:
Код: | execute{
local x = @leave_sched_main_dlg:cur_year['];
local t = _Table[""];
Execute xSql
{$(:x, :t);
declare @ListData AS [dbo].[LeaveSchedCrossType]
delete from @ListData
insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
select * into ##result2 from user_leave_sched_calend (@ListData, @x) };
}; |
Так работает, но имя таблицы не уникально, при работе одновременно нескольких пользователей будет каша.
Если использовать #result2 вместо ##result2, то дальше этой конструкции таблица #result2 не видна. |
|
Вернуться к началу |
|
|
superjek
Зарегистрирован: 04.04.2022 Сообщения: 28
|
Добавлено: Чт Дек 15, 2022 09:28 Заголовок сообщения: |
|
|
Попробуйте создать #result2 с нужной структурой столбцов перед Execute xSql.
А вместо select * into #result2
сделать
insert into #result2
select * from user_leave_sched_calend (@ListData, @x)
либо динамический SQL, что-то вида:
Код: | execute{
local x = @leave_sched_main_dlg:cur_year['];
local t = _Table[""];
Execute xSql
{$(:x, :t);
declare @ListData AS [dbo].[LeaveSchedCrossType]
declare @s varchar(1000)
delete from @ListData
insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
set @s= 'select * into '+@t+' from user_leave_sched_calend (@ListData, @x)'
exec(@s)
};
}; |
|
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Чт Дек 15, 2022 12:20 Заголовок сообщения: |
|
|
Спасибо, так пробовал, но с помощью `EXEC sp_executesql`, не пошло из-за видимости переменных @ListData, @x.
Решил другим способом
Код: | if object_id('tempdb..##result2') IS NOT NULL THEN delete from "##result2" where st=CURSTATION;
...
execute{
local x = @leave_sched_main_dlg:cur_year['];
local st = CURSTATION;
Execute xSql
{$(:x, :st);
declare @ListData AS [dbo].[LeaveSchedCrossType]
delete from @ListData
insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
if object_id('tempdb..##result2') is not null
insert into ##result2 select *, @st st from user_leave_sched_calend (@ListData, @x)
else
select *, @st st into ##result2 from user_leave_sched_calend (@ListData, @x)
};
};
...
if object_id('tempdb..##result2') IS NOT NULL THEN delete from "##result2" where st=CURSTATION;
|
|
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Чт Дек 15, 2022 12:46 Заголовок сообщения: |
|
|
superjek писал(а): | Попробуйте создать #result2 с нужной структурой столбцов перед Execute xSql.
|
Такой вариант, но с ##result2, обдумывался изначально, но отвергнут мной по причине громоздкости кода (370 полей в таблице).
А "совсем" временная таблица #result2 не подошла тоже по причине видимости самой этой временной таблицы, об этом писал выше.
superjek, спасибо за идеи. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Чт Дек 15, 2022 16:20 Заголовок сообщения: |
|
|
До сих пор для меня остается загадкой видимость временных таблиц в моем случае.
Код: |
execute{
local x = @leave_sched_main_dlg:cur_year['];
Execute xSql
{$(:x);
declare @ListData AS [dbo].[LeaveSchedCrossType]
delete from @ListData
insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
select * into #result2 from user_leave_sched_calend (@ListData, @x)
};
}; |
Изначально использовал этот код. Таблица #result была создана до этого блока, её было видно в этом блоке.
Но, таблица #result2 была создана в этом блоке и сразу после этого блока запрос к таблице #result2 сообщал, что такой таблицы нет.
Но, собственно говоря, даже если б этой проблемы не возникло, пришлось наткнуться на эти грабли чуть дальше, когда результат запроса `select * from #result2` вставлялся в Excel с помощью @@xUtil{connect} и ExcelApp.ActiveWorkBook.Sheets(1).QueryTables.Add, для этого используется другое соединение к базе и в любом случае пришлось бы использовать глобальную временную таблицу. |
|
Вернуться к началу |
|
|
superjek
Зарегистрирован: 04.04.2022 Сообщения: 28
|
Добавлено: Чт Дек 15, 2022 17:12 Заголовок сообщения: |
|
|
Странно, почему у вас не видно временную таблицу после блока
У меня тестовый пример отрабатывает без ошибок)
Код: | execute xSQL {$
if object_id('tempdb..#t','U') is not null drop table #t
select top 100 * into #t from card
};
browser {
select * from #t
};
|
|
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Пт Дек 16, 2022 16:47 Заголовок сообщения: |
|
|
Наверное, отличие в том, что я выполнил блок внутри операторного блока execute {}, пример я взял из документации по RPDesigner. Видать при выходе из блока освобождаются не только переменные, но и временные таблицы.
Однако, вариант с глобальной временной таблицей в моём случае неизбежен, поэтому оставляю как есть. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|