Хранимая процедура SQL :Неправильный синтаксис в встроенных IFS
-
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'.