SQL procédure stockée: syntaxe incorrecte dans les FI imbriquées
-
06-09-2019 - |
Question
Je reçois des erreurs de syntaxe « incorrecte » sur toutes les instructions IF et ELSE imbriquées dans le code suivant ... Qu'est-ce qui ne va pas?
ALTER PROCEDURE [WTFAULT].[usp_WTFault_GetPartFaultStatus]
(
@linxPartId int = -1,
@faultStatus varchar(10) output
)
AS
BEGIN
DECLARE @NbFaultsInParts int,
@NbPartsReturned int
SET @NbPartsReturned = (SELECT COUNT(*) FROM WTFAULT.PART, WTFAULT.FAULT WHERE WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID
AND WTFAULT.PART.LINX_PARTID = @linxPartId AND WTFAULT.FAULT.MATURITY = 'ALLOCATED')
IF @NbPartsReturned > 0 BEGIN
SET @faultStatus = 'ALLOCATED'
END
ELSE BEGIN
SET @NbPartsReturned = (SELECT COUNT(*) FROM WTFAULT.PART, WTFAULT.FAULT WHERE WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID
AND WTFAULT.PART.LINX_PARTID = @linxPartId AND WTFAULT.FAULT.MATURITY = 'DRAFT')
IF @NbPartsReturned > 0 BEGIN
SET @faultStatus = 'DRAFT'
END
ELSE BEGIN
SET @NbPartsReturned = (SELECT COUNT(*) FROM WTFAULT.PART, WTFAULT.FAULT WHERE WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID
AND WTFAULT.PART.LINX_PARTID = @linxPartId AND WTFAULT.FAULT.MATURITY = 'CLOSED')
IF @NbPartsReturned > 0 BEGIN
SET @faultStatus = 'CLOSED'
END
ELSE BEGIN
SET @faultStatus = ''
END
END
END
END
GO
La solution
Essayer cette méthode différente:
ALTER PROCEDURE [WTFAULT].[usp_WTFault_GetPartFaultStatus](@linxPartId int = -1,
@faultStatus varchar(10) output)
AS
SELECT COUNT(*) as MaturityCount,WTFAULT.FAULT.MATURITY INTO #Temp
FROM WTFAULT.PART JOIN WTFAULT.FAULT
ON WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID
WHERE TFAULT.PART.LINX_PARTID = @linxPartId
GROUP BY WTFAULT.FAULT.MATURITY
If (select MaturityCount from #temp where WTFAULT.FAULT.MATURITY = 'ALLOCATED') >0
BEGIN
SET @faultStatus = 'ALLOCATED'
END
ELSE IF
(select MaturityCount from #temp where WTFAULT.FAULT.MATURITY = 'DRAFT') >0
BEGIN
SET @faultStatus = 'DRAFT'
END
ELSE IF
(select MaturityCount from #temp where WTFAULT.FAULT.MATURITY = 'CLOSED') >0
BEGIN
SET @faultStatus = 'CLOSED'
END
ELSE
BEGIN
SET @faultStatus = ''
END
J'ai aussi changé votre requête à utiliser la norme ANSI rejoint. Vous devriez aussi les utiliser à partir de maintenant. Ils sont plus clairs, plus faciles à entretenir et ne donnera pas des résultats erronés lorsque vous utilisez les jointures externes et sont beaucoup moins susceptibles d'entraîner une jointure croisée par hasard.
Autres conseils
Essayez ceci:
DECLARE @faultStatus nvarchar(20)
DECLARE @NbFaultsInParts int
DECLARE @NbPartsReturned int
SELECT @NbPartsReturned = COUNT(*) FROM WTFAULT.PART, WTFAULT.FAULT WHERE WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID AND WTFAULT.PART.LINX_PARTID = @linxPartId AND WTFAULT.FAULT.MATURITY = 'ALLOCATED'
IF @NbPartsReturned > 0 BEGIN
SET @faultStatus = 'ALLOCATED'
END
ELSE BEGIN
SELECT @NbPartsReturned = COUNT(*) FROM WTFAULT.PART, WTFAULT.FAULT WHERE WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID AND WTFAULT.PART.LINX_PARTID = @linxPartId AND WTFAULT.FAULT.MATURITY = 'DRAFT'
IF @NbPartsReturned > 0 BEGIN
SET @faultStatus = 'DRAFT'
END
ELSE BEGIN
SELECT @NbPartsReturned = COUNT(*) FROM WTFAULT.PART, WTFAULT.FAULT WHERE WTFAULT.PART.FAULT_COID = WTFAULT.FAULT.COID AND WTFAULT.PART.LINX_PARTID = @linxPartId AND WTFAULT.FAULT.MATURITY = 'CLOSED'
IF @NbPartsReturned > 0 BEGIN
SET @faultStatus = 'CLOSED'
END
ELSE BEGIN
SET @faultStatus = ''
END
END
END
END
GO
Essayez de ne pas mettre votre begins
et ends
sur les mêmes lignes que les autres déclarations.
En outre, comme une pointe sans rapport, essayez d'utiliser des déclarations comme « select @NbPartsReturned = count(*) from WTFAULT.PART...
» plutôt que « set @NbPartsReturned = (select count(*) from WTFAULT.PART...
», comme vous tournerez deux déclarations en un seul.
Si cela ne prend pas soin de votre problème, essayez de mettre le texte de toute erreur.
Msg 102, Niveau 15, État 1, Procédure usp_WTFault_GetPartFaultStatus, Ligne 25
syntaxe incorrecte près ''.
Msg 156, Niveau 15, État 1, Procédure usp_WTFault_GetPartFaultStatus, ligne 29
Syntaxe incorrecte près du mot clé 'ELSE'.
Msg 102, Niveau 15, État 1, Procédure usp_WTFault_GetPartFaultStatus, Ligne 33
syntaxe incorrecte près ''.
Msg 156, Niveau 15, État 1, Procédure usp_WTFault_GetPartFaultStatus, Ligne 37
Syntaxe incorrecte près du mot clé 'ELSE'.