SQLストアドプロシージャ:入り組んのIF内の不適切な構文
-
06-09-2019 - |
質問
私は、何が悪いの?
...次のコード内のすべてのネストされた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
他の文と同じ行にあなたのbegins
とends
を入れないようにしてくださいます。
また、ちょうど無関係なヒントとして、あなたが一つに二つの文を有効にしますと、むしろ「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' 付近に構文が正しくありません。