Я работаю над функцией, которая не ведет себя так, как ожидалось. Мне кажется, что это происходит потому, что мои IF заявления не гнездятся, как я ожидал:Правильно вложенные инструкции if в SQL-функции
CREATE FUNCTION primaryTheme (
@StoryNumber NVARCHAR(10)
,@ProductType NVARCHAR(10)
)
RETURNS VARCHAR(15)
AS
BEGIN
DECLARE @return VARCHAR(15)
DECLARE @count INT
SELECT @count = COUNT(THM.NAME)
FROM Theme THM
LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId
LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId
LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story
WHERE STY.Number = @StoryNumber
IF (@count = 0)
IF (@ProductType = 'Sprint')
SELECT @return = 'New Development'
ELSE
SELECT @return = NULL
ELSE
IF (@count = 1)
IF (@ProductType = 'Sprint')
SELECT @return = THM.NAME
FROM Theme THM
LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId
LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId
LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story
WHERE STY.Number = @StoryNumber
IF (
@return != 'Adaptive'
OR @return != 'Corrective'
OR @return != 'Perfective'
OR @return != 'Preventative'
)
SELECT @return = 'New Development'
ELSE
SELECT @return = THM.NAME
FROM Theme THM
LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId
LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId
LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story
WHERE STY.Number = @StoryNumber
IF (
@return != 'Adaptive'
OR @return != 'Corrective'
OR @return != 'Perfective'
OR @return != 'Preventative'
OR @return != 'New Development'
)
SELECT @return = NULL
ELSE
IF (@count > 1)
IF (@ProductType = 'Sprint')
SELECT @return = THM.NAME
FROM Theme THM
LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId
LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId
LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story
WHERE STY.Number = @StoryNumber
AND THM.NAME != 'New Development'
AND (
THM.NAME = 'Adaptive'
OR THM.NAME = 'Corrective'
OR THM.NAME = 'Perfective'
OR THM.NAME = 'Preventative'
)
IF (@return IS NULL)
SELECT @return = 'New Development'
ELSE
SELECT @return = THM.NAME
FROM Theme THM
LEFT JOIN ProductTheme PDT ON THM.PK_Theme = PDT.ThemeId
LEFT JOIN StoryProductTheme SPT ON PDT.PK_ProductTheme = SPT.ProductThemeId
LEFT JOIN Story STY ON SPT.StoryId = STY.PK_Story
WHERE STY.Number = @StoryNumber
AND THM.NAME = 'New Development'
AND (
THM.NAME = 'Adaptive'
OR THM.NAME = 'Corrective'
OR THM.NAME = 'Perfective'
OR THM.NAME = 'Preventative'
)
IF (@return IS NULL)
SELECT @return = 'New Development'
RETURN @return
END
Эти IF satements:
IF (
@return != 'Adaptive'
OR @return != 'Corrective'
OR @return != 'Perfective'
OR @return != 'Preventative'
)
SELECT @return = 'New Development'
должны быть в пределах других. Как я могу убедиться, что они работают правильно?
Используйте 'begin' и' end'. –
Я не могу поверить, что все эти ifs могут быть необходимы. Но с самого начала логика кажется пустым. Как на самом деле '@ count' когда-либо будет 0 или 1? –
Упс, я пропустил кусок Я добавлю его –