У меня есть временная таблица, которая содержит данные, необходимые для выбора, но я не могу присоединиться к основному оператору выбора, потому что он содержит слишком много строк, а группировка недостаточно хороша. Поэтому я решил использовать значения непосредственно из моей временной таблицы в выборе, и это прекрасно работает. Но так как мне нужно добавить выборку из временной таблицы 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),
...
Любое предложение?