質問

私は、何が悪いの?

...次のコード内のすべてのネストされたIFとELSE文の「不正な構文」エラーが発生します
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
役に立ちましたか?

解決

この別の方法を試してください:

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  

私も参加するANSI標準を使用するようにクエリを変更しました。あなたは今からあまりにもそれらを使用する必要があります。彼らは、保守が容易明確であり、あなたは、外部結合を使用して、クロス事故により参加をもたらすのにはるかに少ない可能性があるときに、誤った結果が得られません。

他のヒント

これを試してください:

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

他の文と同じ行にあなたのbeginsendsを入れないようにしてくださいます。

また、ちょうど無関係なヒントとして、あなたが一つに二つの文を有効にしますと、むしろ「select @NbPartsReturned = count(*) from WTFAULT.PART...」よりも「set @NbPartsReturned = (select count(*) from WTFAULT.PART...」のようなステートメントを使用してみます。

これはあなたの問題の世話をしない場合は、全体のエラーのテキストを入れてみてください。

メッセージ102、レベル15、状態1、プロシージャusp_WTFault_GetPartFaultStatus、ライン25

'' の近くに不正な構文をます。

メッセージ156、レベル15、状態1、プロシージャusp_WTFault_GetPartFaultStatus、29行目

キーワード 'ELSE' 付近に

構文が正しくありません。

メッセージ102、レベル15、状態1、プロシージャusp_WTFault_GetPartFaultStatus、ライン33

'' の近くに不正な構文をます。

メッセージ156、レベル15、状態1、プロシージャusp_WTFault_GetPartFaultStatus、ライン37

キーワード 'ELSE' 付近に

構文が正しくありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top