Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос про табличную функцию  [new]
Sergei A.
Member

Откуда:
Сообщений: 21
Есть переменная таблица @UsersTable, куда предварительно были отобраны ID пользователей.
Есть табличная функция, которая одним из параметров принимает UserID.

Вопрос: кроме как через обход в курсоре/цикле таблицы @UsersTable, можно ли передать в функцию UserID из @UsersTable?
17 ноя 16, 12:06    [19902915]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про табличную функцию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Sergei A.,

User-Defined Table Types, но это в производительности всё не очень
17 ноя 16, 12:08    [19902928]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про табличную функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TaPaK
Sergei A.,

User-Defined Table Types, но это в производительности всё не очень
И это потребует переделать функцию.
17 ноя 16, 12:40    [19903122]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про табличную функцию  [new]
o-o
Guest
а что менять-то можно?
если функцию менять нельзя,
а принимает она только 1 UserID,
то что еще-то можно сделать, кроме как передавать по одному?
просто зачем курсор, надо же делать CROSS APPLY

вот пример табличной функции, принимающей юзер ид,
возвращающей всех ему подчиненных.

ее можно вызвать как для одного юзер ид,
так и для всех сразу, лежащих в @t:
create table [dbo].[users](
    [userid] [int] ,
    [username] [varchar](50) ,
    [managerid] [int] ,
   )

insert into dbo.users
    ([userid], [username], [managerid])
values
(1,'aaa',null),
(2,'bbb',1),
(3,'ccc',2),
(4,'ddd',1),
(5,'eee',3),
(6,'fff',5),
(7,'ggg',5),
(8,'hhh',4); 
go

create function dbo.udf_erik(@id int)
returns table
as
return
with usercte
     as (select userid,
                username,
                managerid,
                0 as emplevel
         from   [users]
         where  managerid = @id
         union all
         select usr.userid,
                usr.username,
                usr.managerid,
                mgr.[emplevel] + 1
         from   [users] as usr
                inner join usercte as mgr
                        on usr.managerid = mgr.userid
         where  usr.managerid is not null)
select *
from   usercte as u; 
go

select *
from dbo.udf_erik(3); -- for one id

------------------------------------------------
declare @t table(id int);
insert into @t values (1), (5);

select *
from @t cross apply dbo.udf_erik(id); -- for all id from @t
17 ноя 16, 12:40    [19903123]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про табличную функцию  [new]
Sergei A.
Member

Откуда:
Сообщений: 21
o-o,

Спасибо, CROSS APPLY — это то, что нужно!

Стыдно сказать, в работе с этим оператором толком не сталкивался, не подумал, что его удобно будет применить к этой задаче.
17 ноя 16, 12:57    [19903215]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить