Как передать один параметр ID в скалярной функции внутри блока Select, используя инструкцию IN в #temp_table - PullRequest
0 голосов
/ 08 июля 2019

Я написал простую хранимую процедуру, которая использует скалярную функцию для 4 выбранных данных.

Я передаю идентификатор, который является частью отверстия, выбранного в качестве параметра этой функции.

И наконец, эта обработанная процедура совпадает, если идентификаторы находятся в таблице Temp_Table, которую я создал в начале SP.

Проблема: SP работает в бесконечном цикле, как.

Я знаю, что проблема, безусловно, связана с передачей нескольких параметров в виде Id в функции, но я не понимаю логику здесь!

Я попытался провести отдельное тестирование и получил результаты, как и ожидалось.

Вот хранимая процедура:

ALTER PROCEDURE GetBordereauCotisations
@annee int,
@sectionId int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


    --Creation table temporaire pour stocker les adhérents d'une section
    IF OBJECT_ID('tempdb.dbo.#table_adherent_ids', 'U') IS NOT NULL
        DROP TABLE #table_adherent_ids; 
    CREATE TABLE #table_adherent_ids (AdherentId int);

    BEGIN
        INSERT INTO #table_adherent_ids 
        SELECT p.RessourceId
        FROM Personnes p
        INNER JOIN PersonneAdherentSituations ps ON ps.RessourceId = p.RessourceId
        WHERE p.SectionId = @sectionId AND ps.StatutAdhesion = 880
    END

    SELECT 
        DISTINCT pas.NumeroAdherent AS NumAdherent,
        CONCAT(ppi.Nom, ' ', ppi.Prenom) AS NomPrenom,
        si.Numero AS CodeSection,
        'CodeTarif?' AS CodeTarif,
        dbo.GetCodeTarifByTrimestrePaye(pas.RessourceId, @annee, 1) AS T1,
        dbo.GetCodeTarifByTrimestrePaye(pas.RessourceId, @annee, 2) AS T2,
        dbo.GetCodeTarifByTrimestrePaye(pas.RessourceId, @annee, 3) AS T3,
        dbo.GetCodeTarifByTrimestrePaye(pas.RessourceId, @annee, 4) AS T4
    FROM PersonneAdherentSituations pas
    INNER JOIN PersonnePersoIdentites ppi ON pas.RessourceId = ppi.RessourceId
    INNER JOIN SectionIdentifications si ON si.RessourceId = @sectionId
    INNER JOIN PersonneAdherentFinancesVersements pfv ON pfv.SectionNumero = si.Numero
    WHERE YEAR(pfv.[Date]) = @annee
    GROUP BY pas.NumeroAdherent, ppi.Nom, ppi.Prenom, si.Numero, pas.RessourceId
    HAVING pas.RessourceId IN (SELECT tai.AdherentId FROM #table_adherent_ids tai)

    BEGIN
        DROP TABLE #table_adherent_ids;
    END
END
GO

Вот функция;

ALTER FUNCTION GetCodeTarifByTrimestrePaye
(
@adhrentId int,
@annee int,
@trimestre int
)
RETURNS nvarchar (MAX)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @codeTarif nvarchar (MAX);
    DECLARE @rowsSelected int = (SELECT CASE 
                                    WHEN @trimestre = 1 THEN 1
                                    ELSE @trimestre - 1 END)
    DECLARE @apayerAnnee int = (SELECT MAX(CONVERT(int, SUBSTRING(pfv.Apayer, 1, 4)))
                            FROM PersonneAdherentFinancesVersements pfv
                            WHERE YEAR(pfv.[Date]) = @annee
                            AND pfv.RessourceId = @adhrentId)
    DECLARE @apayerTrimestre int = (SELECT MAX(CONVERT(int, SUBSTRING(pfv.Apayer, 7, 1)))
                                    FROM PersonneAdherentFinancesVersements pfv
                                    WHERE YEAR(pfv.[Date]) = @annee
                                    AND pfv.RessourceId = @adhrentId)

    SET @codeTarif = (SELECT CASE 
                        WHEN @annee < @apayerAnnee 
                            THEN l.Texte
                        WHEN @annee = @apayerAnnee AND @trimestre <= @apayerTrimestre
                            THEN l.Texte
                        ELSE
                            ''
                        END
                    FROM PersonneAdherentFinancesVersements pfv
                    INNER JOIN ListeStatique l ON l.Id = pfv.CodeTarifId
                    WHERE pfv.IsValidated = 1 
                    AND pfv.ValideParFede = 1
                    AND pfv.RessourceId = @adhrentId
                    ORDER BY l.Texte
                    OFFSET @rowsSelected ROWS
                    FETCH NEXT 1 ROWS ONLY)

    RETURN @codeTarif;
END
GO

Как я могу получить только один ожидаемый результат, используя мою скалярную функцию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...