2009-04-08 9 views
0

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?Procédure stockée SQL: syntaxe incorrecte dans les IF imbriqués

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 
+0

Vous n'avez pas spécifié quel SGBD, mais je suis sûr que ceux qui le connaissent reconnaîtront la syntaxe. Aussi, que veut dire "imbriqué"? –

Répondre

0

Essayez cette autre méthode:

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 les utiliser aussi à partir de maintenant. Ils sont plus clairs, plus faciles à entretenir et ne donneront pas de résultats erronés lorsque vous utiliserez des jointures externes et seront beaucoup moins susceptibles d'entraîner une jointure accidentelle.

0

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 
0

Essayez de ne pas mettre votre begins et ends sur les mêmes lignes que les autres déclarations. De même, tout comme une astuce non reliée, essayez d'utiliser des instructions telles que "select @NbPartsReturned = count(*) from WTFAULT.PART..." plutôt que "set @NbPartsReturned = (select count(*) from WTFAULT.PART...", car vous inverserez deux instructions en une seule.

Si cela ne résout pas votre problème, essayez d'afficher le texte de l'erreur complète.

0

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é 'AUTRE'.

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é 'AUTRE'.

Questions connexes