Tengo una tabla temporal que contiene los datos necesarios en la selección, pero no puedo unirme a la declaración de selección principal porque contiene demasiadas filas y la agrupación no es lo suficientemente buena. Así que decidí usar valores directamente de mi tabla temporal en la selección, y funciona bien. Pero como necesito agregar la selección de la tabla temporal 50 veces como subconsultas en esa selección principal, estaba considerando moverla para que funcione, ya que es mejor llamar a una función 50 veces que las subconsultas. Mi pregunta es cómo pasar valores de esa tabla a la función. La función también se proporcionará con otros parámetros necesarios para extraer el valor exacto de esa tabla. Sé que no puedo pasar la tabla temporal como parámetro, pero ¿qué pasa con la variable de la tabla? No me importa si uso una tabla temporal o una variable de tabla. En primer lugar, escribí una función que contiene la declaración de selección igual que para la tabla temporal, y funciona pero demasiado lento. Entonces, si pudiera pasar los resultados de la tabla a una función, aceleraría el proceso.

Mi función ahora se ve así:

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

Y me gustaría usarlo desde un procedimiento almacenado como este:

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

¿Alguna sugerencia?

0
Nikolas Skurupatis 10 oct. 2019 a las 12:28

1 respuesta

La mejor respuesta

La respuesta es para aquellos que llegan a esta página con el mismo o similar problema. Creé un tipo de tabla:

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

Incluido en función:

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

En SP variable de tipo de tabla declarada

Declare @PremiumTableType PremiumTableType 

Datos insertados de mi tabla temporal

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

Y llamada función de SP como

document.GetPersonPremium(@DocumentID, p.PersonID, pt.PeriodID, 'Intern', @PremiumTableType)
0
Nikolas Skurupatis 10 oct. 2019 a las 13:50