Я написал простую хранимую процедуру, которая использует скалярную функцию для 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
Как я могу получить только один ожидаемый результат, используя мою скалярную функцию?