Передать таблицу в качестве параметра функции - PullRequest
0 голосов
/ 10 октября 2019

У меня есть временная таблица, которая содержит данные, необходимые для выбора, но я не могу присоединиться к основному оператору выбора, потому что он содержит слишком много строк, а группировка недостаточно хороша. Поэтому я решил использовать значения непосредственно из моей временной таблицы в выборе, и это прекрасно работает. Но так как мне нужно добавить выборку из временной таблицы 50 раз в качестве подзапросов в этом основном выделении, я подумал о том, чтобы переместить ее в функцию, поскольку лучше вызывать функцию 50 раз, чем подзапросы. У меня вопрос, как передать значения из этой таблицы в функцию? Функция также будет снабжена другими параметрами, необходимыми для извлечения точного значения из этой таблицы. Я знаю, что не могу передать временную таблицу в качестве параметра, но как насчет табличной переменной? Мне все равно, если я использую временную таблицу или переменную таблицы. Во-первых, я написал функцию, содержащую оператор выбора, такой же, как для временной таблицы, и она работает, но слишком медленно. Так что, если бы я мог передать результаты таблицы в функцию, это ускорило бы процесс ..

Моя функция теперь выглядит так:

ALTER FUNCTION [document].[GetPersonPremium] 
(
    -- Add the parameters for the function here
    @DocumentId bigint,
    @PersonId bigint,
    @PeriodId int,
    @PersonRole nvarchar(20)
)
RETURNS DECIMAL (18,2)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @premiumSum decimal (18,2)


    -- Add the T-SQL statements to compute the return value here
    set @premiumSum = 
        (select top 1 pt.Premium from document.Document d
        inner join document.Person p on p.DocumentCalculationLayerID = dcl.DocumentCalculationLayerID
        inner join document.PersonTasks pt on pt.PersonId = p.PersonId
        inner join document.PersonCalculationHelper pch on pch.PersonTaskId = pt.PersonTaskId
        inner join document.PersonTaskCalculationHelper ptch on ptch.PersonId = p.PersonId
        inner join document.PersonMarkTypes pmt on pmt.ConcernMarkTypeID = ptch.ConcernMarkTypeId
        where dcl.DocumentID = @DocumentId and p.PersonId = @PersonId and pch.PeriodId = @PeriodId and pmt.Name = @PersonRole)

    -- Return the result of the function
    RETURN @premiumSum

END

И я хотел бы использовать ее изпроцедура, подобная этой:

...
    Engineer = Coalesce(document.GetPersonPremium(@DocumentId, p.PersonID, 65, 'Intern'), 0.00),
...

Любое предложение?

1 Ответ

0 голосов
/ 10 октября 2019

Ответ для тех, кто заходит на эту страницу с такой же или похожей проблемой. Я создал тип таблицы:

CREATE TYPE PremiumTableType AS TABLE
(
    PersonId bigint,
    PeriodId int,
    PersonRole nvarchar(20),
)

Включил его в функцию:

ALTER FUNCTION [document].[GetPersonPremium] 
(
    -- Add the parameters for the function here
    @DocumentId bigint,
    @PersonId bigint,
    @PeriodId int,
    @PersonRole nvarchar(20),
    @PremiumTableType PremiumTableType readonly
)
RETURNS DECIMAL (18,2)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @premiumSum decimal (18,2)


    -- Add the T-SQL statements to compute the return value here
    set @premiumSum = (select p.Premium from @PremiumType p where p.PersonId = @PersonId and p.PeriodId = @PeriodId and p.PersonRole = @PersonRole)

    -- Return the result of the function
    RETURN @premiumSum

END

В SP объявлена ​​переменная типа таблицы

Declare @PremiumTableType PremiumTableType 

Вставлены данные из моей временной таблицы

Insert into @PremiumTableType (PersonID, PeriodId, ConcernRole, PersonPremium)
Select p.PersonID, ...

И вызывается функция из SP как

document.GetPersonPremium(@DocumentID, p.PersonID, pt.PeriodID, 'Intern', @PremiumTableType)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...